【发布时间】:2013-02-03 00:08:13
【问题描述】:
我有一组 pthreads,它们都需要完成一个任务,然后阻塞直到它们中的最后一个完成任务,然后让它们全部移动到下一个任务。许多任务都会发生这种情况。
我正在考虑有一个计数器,它开始等于每个任务开始时的线程数,当每个线程完成一个任务时,它会使用互斥锁安全地递减它,直到最后一个线程使其为零。在任务结束时,除了最后一个要完成的线程之外的所有线程都会调用 pthread_cond_wait,最后一个线程会调用 pthread_cond_broadcast 告诉其他线程进入下一个任务。然后最后一个线程不会等待,而是继续执行此任务。
但是,我还有一个问题。不能保证倒数第二个递减计数器的线程会在最后一个线程调用 pthread_cond_broadcast 之前调用 pthread_cond_wait。
在 C 和 POSIX 中有什么方法可以安全地处理这个问题吗?
【问题讨论】:
-
即使你已经找到了使用屏障的解决方案,这句话让我有点困扰:“不能保证倒数第二个减少计数器的线程会在最后一个线程调用 pthread_cond_broadcast 之前调用 pthread_cond_wait ”。如果您正确使用条件变量,则倒数第二个线程和最后一个线程之间不能竞争以递减计数器,因为倒数第二个线程在调用
pthread_cond_wait()时应该持有互斥锁。您关心的问题是您在调用pthread_cond_wait()时必须持有互斥锁的原因。 -
是的,我现在明白了,Sheu 的解决方案向我指出了这一点。
标签: c multithreading pthreads posix