gpt4 book ai didi

c - 了解posix屏障机制

转载 作者:行者123 更新时间:2023-12-04 12:32:05 25 4
gpt4 key购买 nike

这是一段(非常简化,带有全局变量和其他“气味”)的 C 代码,它使用 posix 屏障原语来同步线程启动。

#include <pthread.h>
#include <stdio.h>

pthread_barrier_t barrier;

void* thread_func(void* aArgs)
{
pthread_barrier_wait(&barrier);

printf("Entering thread %p\n", (void*)pthread_self());
int i;
for(i = 0 ; i < 5; i++)
printf("val is %d in thread %p \n", i, (void*)pthread_self());
}

int main()
{
pthread_t thread_1, thread_2;
pthread_barrier_init(&barrier, NULL, 2);

pthread_create(&thread_1, NULL, (void*)thread_func, NULL);
printf("Thread %p created\n", (void*)thread_1);

usleep(500);

pthread_create(&thread_2, NULL, (void*)thread_func, NULL);
printf("Thread %p created\n", (void*)thread_2);

pthread_join(thread_1, NULL);
pthread_join(thread_2, NULL);

pthread_barrier_destroy(&barrier);

return 0;
}

我不明白,为什么“进入线程......”字符串不会同时出现在输出中?当我在上面运行程序时,通常会得到类似的输出:
Thread 0xb74fdb40 created
Thread 0xb6cfcb40 created
Entering thread 0xb6cfcb40
val is 0 in thread 0xb6cfcb40
val is 1 in thread 0xb6cfcb40
val is 2 in thread 0xb6cfcb40
val is 3 in thread 0xb6cfcb40
val is 4 in thread 0xb6cfcb40
Entering thread 0xb74fdb40
val is 0 in thread 0xb74fdb40
val is 1 in thread 0xb74fdb40
val is 2 in thread 0xb74fdb40
val is 3 in thread 0xb74fdb40
val is 4 in thread 0xb74fdb40

我期望的是同时启动两个线程,并在输出中按顺序出现“进入线程......”字符串。
编译它: gcc barrier.c -pthread

我做错了什么?

最佳答案

您的屏障正在做的是阻止线程 1 在创建线程 2 之前产生任何输出。

两个线程都创建后,都越过障碍并被解除阻塞。之后,您不会对它们的交错方式进行任何控制。因此,线程 1 恰好获得了它的时间片并产生了它的所有输出;然后线程 2 获得它的时间片并产生它的所有输出。

尝试在“Enter”输出后移动障碍以获得更好的理解。

关于c - 了解posix屏障机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28663622/

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