c - 如何让多个 POSIX 线程等待另一个线程开始
问题描述
我正在开发一个使用多线程来模拟人和电梯的程序。有一部电梯,多人乘坐电梯。
到目前为止,我正在尝试为每个人创建一个线程,并为电梯创建一个线程。然而,人们需要等待电梯被创建才能开始执行他们的动作,而电梯需要等待所有人都被创建才能开始移动。
我查看了 pthread_join(),但看起来它正在等待一个线程完成,这不是我想要的。
解决方案
您可以使用障碍。
来自randu.org 的 pthread 教程的 pthread Barriers 部分:
pthreads 可以参与屏障以同步到某个时间点。屏障对象像互斥锁或条件变量一样被初始化,除了有一个额外的参数 count。count 变量定义了必须加入屏障以使屏障完成并解除阻塞在屏障处等待的所有线程的线程数。
换句话说,您可以创建一个屏障,n
并且任何调用的线程都pthread_barrier_wait
将等待直到n
调用pthread_barrier_wait
完成。
下面是一个简单的示例,其中所有三个线程都将在任何线程打印“After”之前打印“Before”。
#include <pthread.h>
#include <stdio.h>
pthread_barrier_t barrier;
void* foo(void* msg) {
printf("%s: before\n", (char*)msg);
// No thread will move on until all three threads have reached this point
pthread_barrier_wait(&barrier);
printf("%s: after\n", (char*)msg);
}
int main() {
// Declare three threads
int count = 3;
pthread_t person_A, person_B, elevator;
// Create a barrier that waits for three threads
pthread_barrier_init(&barrier, NULL, count);
// Create three threads
pthread_create(&person_A, NULL, foo, "personA");
pthread_create(&person_B, NULL, foo, "personB");
pthread_create(&elevator, NULL, foo, "elevator");
pthread_join(person_A, NULL);
pthread_join(person_B, NULL);
pthread_join(elevator, NULL);
printf("end\n");
}
在这里运行代码
推荐阅读
- javascript - 使用包含已验证电话号码值的 cookie 标记 Google 地图标记
- python - Python: getting variable from user function
- azure - 无法创建新的 Azure SQL VM
- python-3.x - 处理来自文本文件的行
- adfs - 在 ADFS 4.0 中为 OpenID Connect 客户端启用访问策略
- python - Python dict to select 函数运行所有这些
- ios - 蓝牙并发命令
- visual-studio - 如何停止调试打开新的 Chrome 窗口而不是选项卡?视觉工作室 2017.7
- android - 异步任务的 doInBackground() 中的位置侦听器
- javascript - 如何循环遍历 JQuery 而不会弄乱我的函数的运行顺序