我有一组 pthreads,它们都需要完成一个任务,然后阻塞直到最后一个完成任务,然后让它们全部移动到下一个任务。这发生在许多任务中。
我正在考虑有一个计数器,它开始等于每个任务开始时的线程数,并且当每个线程完成一个任务时,它会使用互斥锁安全地递减它,直到最后一个线程使其为零。在任务结束时,除了最后一个要完成的线程之外的所有线程都会调用 pthread_cond_wait,最后一个线程会调用 pthread_cond_broadcast 来告诉其他线程进入下一个任务。然后最后一个线程不会等待,而是也会继续执行此任务。
但是,我留下了一个问题。不能保证倒数第二个递减计数器的线程会在最后一个线程调用 pthread_cond_broadcast 之前调用 pthread_cond_wait。
C 和 POSIX 有什么方法可以安全地处理这个问题吗?