0

我有一组 pthreads,它们都需要完成一个任务,然后阻塞直到最后一个完成任务,然后让它们全部移动到下一个任务。这发生在许多任务中。

我正在考虑有一个计数器,它开始等于每个任务开始时的线程数,并且当每个线程完成一个任务时,它会使用互斥锁安全地递减它,直到最后一个线程使其为零。在任务结束时,除了最后一个要完成的线程之外的所有线程都会调用 pthread_cond_wait,最后一个线程会调用 pthread_cond_broadcast 来告诉其他线程进入下一个任务。然后最后一个线程不会等待,而是也会继续执行此任务。

但是,我留下了一个问题。不能保证倒数第二个递减计数器的线程会在最后一个线程调用 pthread_cond_broadcast 之前调用 pthread_cond_wait。

C 和 POSIX 有什么方法可以安全地处理这个问题吗?

4

2 回答 2

3

您正在寻找的工具是障碍。

用等待到达它的线程数初始化屏障:

pthread_barrier_init(&barrier, NULL, N);

然后,每个线程调用:

pthread_barrier_wait(&barrier);

The wait blocks until N threads are waiting on it, then all N wake up (conceptually) before any of them return from the wait call.

于 2013-02-03T00:26:10.873 回答
1

我认为您正在寻找pthread_join


编辑:我猜你是想不破坏线程。

pthread_cond_wait应该与互斥锁一起使用,例如:

int counter;                      // initialized to number of threads
struct pthread_cond_t condition;  // initialized previously
struct pthread_mutex_t mutex;     // initialized previously

pthread_mutex_lock(&mutex);
counter -= 1;
while (counter > 0)
    pthread_cond_wait(&condition, &mutex);
pthread_cond_broadcast(&condition);
pthread_mutex_unlock(&mutex);

这将处理锁定、计数器和条件,而无需使用单独的信号量。(您实际上是在实现某种“反向信号量”。)

于 2013-02-03T00:11:15.663 回答