我在喝汤。这个想法可能很糟糕,但我确实需要一个解决方案。
我有两个条件变量,比如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之前唤醒,这不是我想要的。
任何指针都将受到高度赞赏。
感谢
答案 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在线程之间进行负载平衡的示例。