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;
}
  

これは何が起こるかについての私の理解です:

最初のthread(t1)は正常に実行されます。ただし、セマフォがないため、後続のスレッド(t2およびt3)はブロックされます。sは、3つのスレッドすべてが終了するのを待ちますsem_postpthread_joinmain()

これが起こることです:

どちらのスレッドも何も出力しません。出力すらありませんt1(下記の質問1を参照)

でも、

すべてのsを削除すると、pthread_join期待どおりの効果が得られ t1ます。正常に実行され、コマンドプロンプトが返されます。

私の質問:

  1. このページのサンプルコードによると、 (何かを正常に実行して 出力することに加えて)main()待機して終了する必要がt2あります。ここで間違って使用していますか?何が起こっていますか?t3t1 pthread_join

  2. ブロックされたスレッド(t2およびt3)がどうして起こるのですか?main()スレッドは戻るために強制的に終了しますか?

4

1 に答える 1

3

印刷するものはすべて改行で終了している(フォローされていない)ことを確認する必要があります。スレッドへの参加を待機しているブロックstdout中はフラッシュされません。mainプログラムを明示的にキャンセルしても、stdoutフラッシュされません。

于 2012-10-20T09:00:21.800 に答える