这是pthread_cond_wait手册页的摘录 某些实现,特别是在多处理器上,有时会在不同处理器上同时发出条件变量信号时唤醒多个线程。
一般情况下,只要条件等待 返回,线程必须重新评估 谓词与...相关联 条件等待确定是否 可以安全地进行,应该再等一下, 或者应该宣布超时。我的 问题:这里是什么意思 谓词?这是否意味着我需要 再创造一个变量 提供的条件变量 pthread_cond_wait 或是否引用相同的变量 已提供 的调用pthread_cond_wait
答案 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倍。