gpt4 book ai didi

c - 为什么 sem_wait 不阻塞

转载 作者:行者123 更新时间:2023-11-30 16:52:42 27 4
gpt4 key购买 nike

static int res1 = 0;
static int res2 = 0;
static int res3 = 0;

static int counter = 0;
static sem_t sem;



void * func_thread1(void *p)
{
sleep(2);
res1 = 1;
printf("func_thread1\n");
sem_post(&sem);
return NULL;
}

void * func_thread2(void *p)
{
sleep(2);
res2 = 2;
printf("func_thread2\n");
sem_post(&sem);
return NULL;
}

void * func_thread3(void *p)
{
sem_wait(&sem);
sem_wait(&sem);
res3 = res1 + res2;
printf("func_thread3\n");
return NULL;
}




void main()
{
sem_init(&sem, 0, counter);
pthread_t pd1, pd2, pd3;
pthread_create(&pd1, NULL, func_thread1, NULL);
pthread_create(&pd2, NULL, func_thread2, NULL);
pthread_create(&pd3, NULL, func_thread3, NULL);

//pthread_join(pd3, NULL);

printf("main_thread\n");
printf("%d", res3);
}

我试图了解信号量的工作原理。
我正在尝试使 td3 block 等待 td1td2

在我看来,sem_wait会阻塞两次。如果func_thread1func_thread2中的sem_post被执行,func_thread3可以继续。

但是,除非我在 main 中添加 pthread_join(td3, NULL),否则它不起作用。我认为加入是不必要的,因为 sem_wait 可能会阻塞。

那么pthread_join是必要的还是我错误地使用了信号量?

最佳答案

pthread_join 在您的实现中是必需的。

否则,您的进程将完成(即 main 返回),并且在线程 3 打印任何内容之前,所有任务(即线程)都会被终止。

关于c - 为什么 sem_wait 不阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41140538/

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