0

我有以下代码:

#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_joins 将等待main()所有 3 个线程终止。

这就是发生的事情:

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

然而,

就我所期望的而言,删除所有pthread_joins 具有更好的效果: t1成功执行并返回命令提示符。

我的问题:

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

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

4

1 回答 1

3

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

于 2012-10-20T09:00:21.800 回答