我有一组 pthreads,它们都需要完成一个任务,然后阻塞直到最后一个完成任务,然后让它们都转到下一个任务。许多任务都会发生这种情况。
我正在考虑有一个计数器,它在每个任务开始时开始等于线程数,并且当每个线程完成一个任务时,它会使用互斥锁安全地递减它,直到最后一个线程将它设为零。在任务结束时,除最后一个完成的线程外,所有线程都将调用 pthread_cond_wait,最后一个线程将调用 pthread_cond_broadcast 以告知其他线程进入下一个任务。然后最后一个线程不会等待,而是继续执行此任务。
但是,我还有一个问题。无法保证倒数第二个递减计数器的线程会在最后一个线程调用 pthread_cond_broadcast 之前调用 pthread_cond_wait。
在 C 和 POSIX 中有什么方法可以安全地处理这个问题吗?
最佳答案
您正在寻找的工具是障碍。
用等待到达它的线程数初始化屏障:
pthread_barrier_init(&barrier, NULL, N);
然后,每个线程调用:
pthread_barrier_wait(&barrier);
等待会阻塞,直到有 N 个线程在等待它,然后所有 N 个线程都在从等待调用返回之前(概念上)醒来。
关于C/POSIX- pthread_t 阻塞直到任务完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14668000/