C/POSIX- pthread_t 阻塞直到任务完成

标签 c multithreading pthreads posix

我有一组 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/

相关文章:

c - 使用单遍从链接列表中获取倒数第三个节点

java - 关于java多线程的一些问题,

c - 当内存被一个线程修改并被其他线程读取时,使用 pthread 和互斥锁保护内存的最佳方法是什么?

c - C 中 POSIX 线程运行时间和属性显示

java - 出于线程调度目的,线程被禁用。这意味着什么?

posix - pthread 函数 "_np"后缀

c - 使用向后 for 循环替换 C 中字符串的结尾

c - GtkSourceView/GtkSourceBuffer - 如何用红色标记线条并显示图标

c - 有关 glibc 堆保护机制的信息?

javascript - Firefox 中的 Web Worker 调试