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

时间:2012-10-20 08:52:32

标签: c linux pthreads posix semaphore

我有以下代码:

#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()返回,线程是否被强制终止?

1 个答案:

答案 0 :(得分:3)

您应确保使用换行符终止(未遵循)您打印的任何内容。当stdout被阻止等待加入您的主题时,main将不会被刷新。当您明确取消该程序时,stdout将不会被刷新。