C – 保证condvars已准备好发信号

我有一个简单的应用程序,可以与不同的硬件接口。 对于每个硬件,我针对一个独特的监视器函数生成一个pthread_t ,共有6个线程:1个管理器线程和5个工作线程。

每个线程都有一个通用的初始化例程,它等待管理器线程通过以下方式唤醒它:

 pthread_mutex_lock(&mMutex); pthread_cond_wait(&mMutex, &condVar); pthread_mutex_lock(&mMutex); 

然后主线程通过一次发出一个信号来唤醒所有线程:

 pthread_cond_wait(&mMutex1, &condVar1); pthread_cond_wait(&mMutex2, &condVar2); ... pthread_cond_wait(&mMutex5, &condVar5); 

代码实际上工作正常,但这是因为我对时机很幸运。 当主/管理器线程发出pthread_cond_signal ,存在远程但存在的机会,即线程尚未完成初始化。 我需要找到一种方法来保证每个条件变量都有相应的工作线程对它进行了wait调用。

我总是可以创建一个在相应的互斥锁中设置的状态布尔值,但据我所知,我无法在一条指令中primefaces地执行setwait操作。 我也可以使用pthread_barrier_t ,但这只是保证所有线程在进行各自的wait调用之前都是一个或两个指令。

是否有一种可靠的方法来确定已经进行了wait调用,或者我是否需要采用某种定时等待循环/检查方法?

谢谢。

我总是可以创建一个在相应的互斥锁中设置的状态布尔值,但据我所知,我无法在一条指令中primefaces地执行set和wait操作。

这是正确的方法 – 你可以primefaces地进行设置和等待操作,因为条件变量与互斥体的交互方式。 执行pthread_cond_wait()操作时, 必须锁定传入的互斥锁。 如果在执行pthread_cond_signal()时相应地锁定了相同的互斥锁,则等待线程不会在信令线程解锁互斥锁之前唤醒。

所以,以下代码将执行您想要的操作:

 // Flag indicating if the worker thread is waiting or not bool waiting = false; ... // Worker thread code ... do stuff ... while (!condition_is_not_satisfied()) { pthread_mutex_lock(&mutex); waiting = true; pthread_cond_wait(&cond, &mutex); waiting = false; pthread_mutex_unlock(&mutex); } ... // Signalling thread code pthread_mutex_lock(&mutex); if (waiting) { // Worker thread is waiting -- signal it to wake up pthread_cond_signal(&cond); } else { // Worker thread has not yet entered the wait state -- do something else } pthread_mutex_unlock(&mutex); 

条件变量应始终与受互斥锁保护的谓词配对。 在这种情况下,您的谓词可以只是一个简单的标志:在工作线程中,它看起来像:

 pthread_mutex_lock(&mMutex); while (!woken) pthread_cond_wait(&mMutex, &condVar); pthread_mutex_unlock(&mMutex); 

在经理线程中,它看起来像:

 pthread_mutex_lock(&mMutex); woken = 1; pthread_cond_signal(&condVar); pthread_mutex_unlock(&mMutex); 

这里,如果管理器线程首先获取互斥锁,那么当工作者获取互斥锁时,将设置标志,并且它将不会等待; 如果工作者首先获取互斥锁,则管理器将无法获取互斥锁并设置该标志,直到工作者被保持在pthread_cond_wait