pthread_singal唤醒多处理器系统上的多个线程

时间:2011-02-17 10:49:35

标签: pthreads

这是pthread_cond_wait手册页的摘录 某些实现,特别是在多处理器上,有时会在不同处理器上同时发出条件变量信号时唤醒多个线程。

  

一般情况下,只要条件等待   返回,线程必须重新评估   谓词与...相关联   条件等待确定是否   可以安全地进行,应该再等一下,   或者应该宣布超时。我的   问题:这里是什么意思   谓词?这是否意味着我需要   再创造一个变量   提供的条件变量    pthread_cond_wait 或是否引用相同的变量   已提供   的调用pthread_cond_wait

2 个答案:

答案 0 :(得分:1)

是的,您需要像int done_flag;这样的其他变量才能使用:

pthread_mutex_lock(&mutex);
while (!done_flag) pthread_cond_wait(&cond, &mutex);
/* do something that needs the lock held */
pthread_mutex_unlock(&mutex);
/* do some other stuff that doesn't need the lock held */

当然,它通常可能不是一个标志,而是一个计数或其他类型的变量,具有更复杂的测试条件。

答案 1 :(得分:1)

这可能很有用。您可以使用pthread_kill唤醒特定线程。

sigset_t _fSigMask; // global sigmask

我们在创建线程之前这样做。线程从创建它们的线程继承它们的掩码。我们使用SIGUSR1来表示我们的线程。其他信号可用。

sigemptyset(&_fSigMask);
sigaddset(&_fSigMask, SIGUSR1);
sigaddset(&_fSigMask, SIGSEGV);

然后睡一个线程

int nSig;
sigwait(&fSigMask, &nSig);

然后唤醒线程,YourThread。

pthread_kill(YourThread, SIGUSR1);

顺便说一句,在我们测试期间,以这种方式睡眠和唤醒我们的线程比使用条件变量快大约40倍。