2011-02-17 65 views
1

这是pthread_cond_wait手册页的摘录 某些实现,特别是在多处理器上的实现,有时可能会导致多个线程在不同处理器上同时发送条件变量时唤醒。pthread_singal在多处理器系统上唤醒多个线程

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

回答

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

这可能会有用。你可以使用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倍。