2011-08-04 43 views
2

我在一个汤里。这个想法可能不好,但我确实需要一个解决方案。条件变量信号问题

  • 我有两个条件变量,说A和B.

  • 主题1,2和3正在等待A.螺纹4在等待B.

  • B将被pthread_cond - 信号()通过螺纹2,即线4将是 信号通知通过线程来唤醒现在2.

,我有另一个线程5,其pthread_cond_broadca条件变量A上的sts()。在线程4唤醒之前,我需要唤醒所有线程1,2和3。也就是说,如果线程2唤醒并且线程4上的信号可能在线程3执行之前醒来,这不是我想要的。

任何指针将不胜感激。

感谢

回答

0

考虑为此使用ZeroMQ的进程内信令。 ZeroMQ实现了一个消息模型,可以有效地用于协调线程,以及进程间或网络消息。

有关详细信息:http://api.zeromq.org/2-1-1:zmq-inproc

这里是负载平衡使用ZeroMQ和Java线程之间的一个例子。

2

可以解决这一使用条件变量。

pthread_mutex_lock(&thread4_lock); 
while (!thread1_flag || !thread2_flag || !thread3_flag) 
    pthread_cond_wait(&thread4_cond, &thread4_lock); 
pthread_mutex_unlock(&thread4_lock); 

/* Thread 4 can continue */ 

:而不是只由线程2设定的条件线程4的等待,有它等待的只是所有线程1,线程2和线程3的后置都做自己的事情的条件当线程1做了的事情,它设置的条件的组成部分:

pthread_mutex_lock(&thread4_lock); 
thread1_flag = 1; 
pthread_cond_signal(&thread4_cond); 
pthread_mutex_unlock(&thread4_lock); 

...且同样线程2和线程3线程4只会继续一旦所有的标志已设置。

+0

这是可行的,但不要忘了'thread11_flag','thread2_flag'和'thread3_flag'应该声明'volatile',你还需要在非x86系统的适当内存屏障以确保内存更新对其他处理器可见。 –

+1

@Adam罗森菲尔德:'volatile'和阻挡不是必需的,因为这三个标志由'thread4_lock'互斥具体根据示例保护。 – caf