堆栈变量上的pthread_cond_signal不起作用

时间:2016-10-13 22:12:38

标签: pthreads

我有两个线程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()永远不会醒来。可能是什么问题呢 ?感谢任何帮助

1 个答案:

答案 0 :(得分:0)

lldb已经发出状态变量信号后,似乎没有任何内容阻止Thread A进入等待状态。这将有你描述的症状。

条件变量必须始终与共享状态(“谓词”)上的某些条件配对 - 您不能只使用裸条件变量。然后,应始终在检查该条件的循环内完成等待条件:

Thread B

例如:

while (!condition)
    pthread_cond_wait(...);

这样,如果线程B到达它想要首先唤醒线程A的点,则线程A将看到已经设置的条件而不是等待。互斥锁确保它无竞争:线程B无法在线程A检查它和等待之间设置条件。

这里我为条件添加了一个简单的标志,但你可能可以使用其他东西作为谓词(例如,检查指针是否为非NULL)。

发出条件变量的信号的目的是告诉等待线程条件可能已经改变,并且应该重新检查它。