我有以下代码:
#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
s 将等待main()
所有 3 个线程终止。
这就是发生的事情:
两个线程都不会输出任何东西。甚至没有t1
输出(见下面的问题 1)
然而,
就我所期望的而言,删除所有pthread_join
s 具有更好的效果:
t1
成功执行并返回命令提示符。
我的问题:
根据this page上的示例代码,
main()
应该等待t2
并t3
终止(除了成功执行t1
并 输出一些东西)。我在这里使用pthread_join
不正确吗?发生了什么?为什么阻塞的线程(
t2
和t3
)会发生?线程是否因返回而被迫终止main()
?