gpt4 book ai didi

c - POSIX 信号量/线程无法正常工作?

转载 作者:太空宇宙 更新时间:2023-11-04 07:31:59 25 4
gpt4 key购买 nike

我有以下代码:

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

sem_t semr;

void* func(void* i)
{
sem_wait(&semr);
printf("\nInstance %d running",*(int*)i);
//sem_post(&semr);
return NULL;
}


int main(void)
{
sem_init(&semr,0,1);
void* (*fp)(void*);
int s1,s2,s3,val=0;
pthread_t t1,t2,t3;
fp=&func;
val=1;
s1=pthread_create(&t1,NULL,fp,(void*)&val);
val=2;
s2=pthread_create(&t2,NULL,fp,(void*)&val);
val=3;
s3=pthread_create(&t3,NULL,fp,(void*)&val);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_join(t3,NULL);
return 0;
}

这是我对发生的事情的理解:

第一个线程(t1)执行成功。随后的线程(t2t3)虽然被阻塞了,因为我从来没有 sem_post 信号量。 pthread_join 将使 main() 等待所有 3 个线程终止。

是这样的:

两个线程都不会输出任何内容。甚至没有 t1 的输出(见下面的问题 1)

但是,

删除所有 pthread_join 在我期望的方面有更好的效果:t1执行成功并返回命令提示符。

我的问题:

  1. 根据 this page 上的示例代码, main() 应该等待 t2t3 终止(除了成功执行 t1 输出东西)。我在这里使用 pthread_join 不正确吗?发生了什么事?

  2. 为什么会发生阻塞线程(t2t3)?线程是否由于 main() 返回而被迫终止?

最佳答案

您应该确保您打印的任何内容都以换行符终止(不跟随)。当 main 被阻塞等待加入您的线程时,stdout 不会被刷新。当您明确取消该程序时,stdout 将不会被刷新。

关于c - POSIX 信号量/线程无法正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12986845/

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