gpt4 book ai didi

c - 如何使多个POSIX线程等待另一个开始

转载 作者:行者123 更新时间:2023-12-03 12:54:09 25 4
gpt4 key购买 nike

我正在开发一个使用多线程来模拟人员和电梯的程序。一台电梯,多人乘坐电梯。

到目前为止,我正在尝试为每个人创建一个线程,为电梯创建一个线程。但是,人们需要等到电梯被创建后才能开始执行其 Action ,并且电梯需要等待所有人被创建后才能开始移动。

我查看了pthread_join(),但看起来它正在等待线程完成,这不是我想要的。

最佳答案

您可以使用障碍。

randu.org's pthread tutorial的pthread Barriers部分中:

pthreads can participate in a barrier to synchronize to some point in time. Barrier objects are initialized like mutexes or condition variables, except there is one additional parameter, count. The count variable defines the number threads that must join the barrier for the barrier to reach completion and unblock all threads waiting at the barrier.



换句话说,您可以使用 n创建一个障碍,任何调用 pthread_barrier_wait的线程都将等待,直到对 n进行了 pthread_barrier_wait调用为止。

下面是一个简单的示例,其中所有三个线程在任何线程打印“之后”之前都将打印“之前”。
#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");
}

运行代码 here

关于c - 如何使多个POSIX线程等待另一个开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53125648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com