我有以下代码:
#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
)成功执行。然而,后续线程(t2
和t3
)被阻止,因为我从不sem_post
信号量。 pthread_join
将使main()
等待所有3个线程终止。
两个线程都不会输出任何。甚至不是t1
的输出(参见下面的问题1)
删除所有pthread_join
对我的期望有更好的效果:
t1
成功执行,并返回命令提示符。
我的问题:
根据this page上的示例代码,main()
应等待t2
和t3
终止(除了成功执行t1
和输出某些内容)。我在这里错误地使用了pthread_join
吗?发生了什么事?
为什么阻止线程(t2
和t3
)会发生?由于main()
返回,线程是否被强制终止?
答案 0 :(得分:3)
您应确保使用换行符终止(未遵循)您打印的任何内容。当stdout
被阻止等待加入您的主题时,main
将不会被刷新。当您明确取消该程序时,stdout
将不会被刷新。