我有两个线程A和B.线程A应该阻塞直到从threadB发出信号,pthread_cond_signal似乎没有工作:
struct TR_EVT
{
Dest* pQDest ;
pthread_cond_t evWait ;
pthread_mutex_t mutex_tr ;
};
DataSet dSet ;
threadA()
{
TR_EVT TrEvt ;
dSet->setContext(&TrEvt);
pthread_cond_init(&TrEvt.evWait, NULL);
.
.
cout << "Entering Sleep\n" ;
pthread_mutex_lock(&TrEvt.mutex_tr);
pthread_cond_wait(&TrEvt.evWait, &TrEvt.mutex_tr);
pthread_mutex_unlock(&TrEvt.mutex_tr);
cout << "Out of Sleep\n" ;
}
threadB()
{
.
.
TR_EVT * pTrEvt = NULL ;
pTrEvt = (TR_EVT *)dSet->getContext()
.
.
cout << "Signalling...\n" ;
pthread_mutex_lock(&(pTrEvt->mutex_tr));
pthread_cond_signal(&(pTrEvt->evWait); //wake up thread A
pthread_mutex_unlock(&(pTrEvt->mutex_tr));
.
.
.
}
threadA()永远不会醒来。可能是什么问题呢 ?感谢任何帮助
答案 0 :(得分:0)
在lldb
已经发出状态变量信号后,似乎没有任何内容阻止Thread A
进入等待状态。这将有你描述的症状。
条件变量必须始终与共享状态(“谓词”)上的某些条件配对 - 您不能只使用裸条件变量。然后,应始终在检查该条件的循环内完成等待条件:
Thread B
例如:
while (!condition)
pthread_cond_wait(...);
这样,如果线程B到达它想要首先唤醒线程A的点,则线程A将看到已经设置的条件而不是等待。互斥锁确保它无竞争:线程B无法在线程A检查它和等待之间设置条件。
这里我为条件添加了一个简单的标志,但你可能可以使用其他东西作为谓词(例如,检查指针是否为非NULL)。
发出条件变量的信号的目的是告诉等待线程条件可能已经改变,并且应该重新检查它。