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