私は次のコードを持っています:
#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_post。pthread_joinmain()
これが起こることです:
どちらのスレッドも何も出力しません。出力すらありませんt1(下記の質問1を参照)
でも、
すべてのsを削除すると、pthread_join期待どおりの効果が得られ
t1ます。正常に実行され、コマンドプロンプトが返されます。
私の質問:
このページのサンプルコードによると、 (何かを正常に実行して 出力することに加えて)
main()待機して終了する必要がt2あります。ここで間違って使用していますか?何が起こっていますか?t3t1pthread_joinブロックされたスレッド(
t2およびt3)がどうして起こるのですか?main()スレッドは戻るために強制的に終了しますか?