【发布时间】:2012-10-20 08:52:31
【问题描述】:
我有以下代码:
#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_joins 将使 main() 等待所有 3 个线程终止。
会发生这种情况:
两个线程都不会输出任何东西。甚至没有t1s 输出(见下面的问题 1)
然而,
删除所有pthread_joins 对我的期望有更好的效果:
t1执行成功,返回命令提示符。
我的问题:
-
根据this page上的示例代码,
main()应该等待t2和t3终止(除了成功执行t1和输出一些东西)。我在这里错误地使用pthread_join吗?发生了什么事? -
为什么会发生阻塞线程(
t2和t3)?线程是否因main()返回而强制终止?
【问题讨论】:
-
你的程序(一旦你修复了
var未被声明)并没有按照你说的那样做。它确实输出了一些东西(换行符)。 -
此代码无法编译。
val从未被声明过。请发布一个完整的示例来展示您的问题。 -
@black_station : 我编辑了你的代码 - 添加了 \n ..现在复制此代码并执行 -- 会正常工作。
-
@CharlesBailey:是的,很抱歉做出了改变!
-
不要投到
void*,这是多余的,只会增加噪音。
标签: c linux pthreads posix semaphore