条件变量信令问题

时间:2011-08-04 03:13:26

标签: c linux variables pthreads conditional-statements

我在喝汤。这个想法可能很糟糕,但我确实需要一个解决方案。

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

  • 线程1,2和3正在等待A.线程4正在等待B。

  • B将由线程2进行pthread_cond-signal(),即线程4将是 通过线程2发出警告。

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

任何指针都将受到高度赞赏。

感谢

3 个答案:

答案 0 :(得分:2)

可以使用条件变量来解决这个问题。让线程4只等待线程2设置的条件,让它等待仅在线程1的所有之后设置的条件,线程2和线程3完成它们的事情:

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 */

当线程1完成它的任务时,它会设置条件的一部分:

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

...同样适用于线程2和线程3.线程4只有在设置了所有标志后才会继续。

答案 1 :(得分:1)

使用semaphore:让每个线程1-3发布信号量,让线程4等待信号量3次,而不是条件变量。

您需要使用sem_init(3)sem_open(3)来创建信号量,sem_post(3)发布信号量,sem_wait(3)等待信号量,然后{ {3}}(如果使用sem_init创建)或sem_destroy(3)sem_close(3)(如果使用sem_open创建)以销毁信号量。

答案 2 :(得分:0)

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

了解更多信息:http://api.zeromq.org/2-1-1:zmq-inproc

以下是使用ZeroMQ和Java在线程之间进行负载平衡的示例。