在我的計劃喚醒有有等待從其它代碼的一部分喚醒部分代碼:
下面是進入睡眠狀態的一部分:調用pthread_cond_wait不調用pthread_cond_broadcast
void flush2device(int task_id) {
if (pthread_mutex_lock(&id2cvLock) != SUCCESS) {
cerr << "system error - exiting!!!\n";
exit(1);
}
map<int,pthread_cond_t*>::iterator it;
it = id2cv.find(task_id);
if(it == id2cv.end()){
if (pthread_mutex_unlock(&id2cvLock) != SUCCESS) {
cerr << "system error\n UNLOCKING MUTEX flush2device\n";
exit(1);
}
return;
}
cout << "Waiting for CV signal" <<endl;
if(pthread_cond_wait(it->second, &id2cvLock)!=SUCCESS){
cerr << "system error\n COND_WAIT flush2device - exiting!!!\n";
exit(1);
}
cout << "should be right after " << task_id << " signal" << endl;
if (pthread_mutex_unlock(&id2cvLock) != SUCCESS) {
cerr << "system error\n UNLOCKING MUTEX flush2device -exiting!!!\n";
exit(1);
}
}
在代碼的另一部分,有(信令)的醒來部分:
//id2cv is a map <int, pthread_cond_t*> variable. - the value is a pointer to the cv on
//which we call with the broadcast method.
if(pthread_mutex_lock(&id2cvLock)!=SUCCESS){
cerr <<"system error\n";
exit(1);
}
id2cv.erase(nextBuf->_taskID);
cout << "In Thread b4 signal, i'm tID " <<nextBuf->_taskID << endl;
if (pthread_cond_broadcast(nextBuf->cv) != 0) {
cerr << "system error SIGNAL_CV doThreads\n";
exit(1);
}
cout << "In doThread, after erasing id2cv " << endl;
if(pthread_mutex_unlock(&id2cvLock)!=SUCCESS){
cerr <<"system error\n;
exit(1);
}
大多數奔跑的工作得很好,但過一段時間的程序只是停止「反應」 - 第一種方法(ABO ve)只是沒有通過cond_wait部分 - 似乎沒有人真的按時(或從其他原因)向她發送信號 - 而另一種方法(最後一部分代碼是它的一部分)繼續運行。
我在哪裏出錯了互斥和信號的邏輯?在調用cond_wait和cond_broadcast方法之前,我已經檢查過pthread_cond_t變量仍然「活着」,並且該區域中沒有任何內容似乎是錯誤的。
感謝您的快速回復。重新調整fisrt建議 - 我使用與喚醒部分必須獲得的相同鎖來鎖定等待部分才能調用廣播 - 這樣,如果調用廣播 - 第一個必須等待(放棄互斥鎖)。變量本身肯定仍然有效 - 在兩次調用之間沒有人觸及它。 – Zach 2011-04-07 14:25:42