我有一组并行线程,所有需要完成的任务,然后阻塞,直到最后一个人完成任务,然后让所有的人都移动到下一个任务。这发生在许多任务上。C/POSIX-的pthread_t的阻塞,直到任务完成
我正在考虑有一个计数器,它等于每个任务开始时的线程数,并且在每个线程完成一个任务时,它会用一个互斥锁安全地递减它,直到最后一个线程使其为零。在任务结束时,除了最后一个完成所有的线程将调用调用pthread_cond_wait,并在最后一个程序将调用调用pthread_cond_broadcast告诉其他线程移动到下一个任务。然后最后一个线程不会等待,而是继续执行此任务。
不过,我留下了一个问题。不能保证第二个到最后一个线程递减计数器将在最后一个线程调用pthread_cond_broadcast之前调用pthread_cond_wait。
有没有办法在C和POSIX安全地处理呢?
即使你已经找到了解决办法使用的障碍,这句话令我烦恼了一下:“有没有保证,倒数第二个线程递减计数器将调用调用pthread_cond_wait最后一个线程调用调用pthread_cond_broadcast之前”。如果你正确地使用了条件变量,那么倒数第二个和最后一个线程之间就不会有竞争,因为倒数第二个线程在调用pthread_cond_wait()时应该保持互斥体。你担心的问题是你在调用'pthread_cond_wait()'时必须保持互斥体的原因。 –
是的,我现在明白了,Sheu的解决方案向我指出了这一点。 –