0
static int res1 = 0;
static int res2 = 0;
static int res3 = 0;
static int counter = 0;
static sem_t sem;
void * func_thread1(void *p)
{
sleep(2);
res1 = 1;
printf("func_thread1\n");
sem_post(&sem);
return NULL;
}
void * func_thread2(void *p)
{
sleep(2);
res2 = 2;
printf("func_thread2\n");
sem_post(&sem);
return NULL;
}
void * func_thread3(void *p)
{
sem_wait(&sem);
sem_wait(&sem);
res3 = res1 + res2;
printf("func_thread3\n");
return NULL;
}
void main()
{
sem_init(&sem, 0, counter);
pthread_t pd1, pd2, pd3;
pthread_create(&pd1, NULL, func_thread1, NULL);
pthread_create(&pd2, NULL, func_thread2, NULL);
pthread_create(&pd3, NULL, func_thread3, NULL);
//pthread_join(pd3, NULL);
printf("main_thread\n");
printf("%d", res3);
}
セマフォの仕組みを理解しようとしています。
ブロックをtd1
とtd2
を待つようにしようとしています。
なぜsem_waitブロックではないのですか?
私の意見では、sem_wait
は2回ブロックされます。 func_thread1
とfunc_thread2
のsem_post
が実行された場合は、func_thread3
を続行できます。
をmain
に追加しないと機能しません。 sem_wait
がブロックできるので、参加は必要ないと思います。
したがってpthread_join
が必要ですか、またはセマフォを間違って使用していますか?
http://man7.org/linux/man-pages/man3/sem_wait.3.html – Yves
sem_wait()は、semが指すセマフォをデクリメント(ロック)します。 セマフォの値が0より大きい場合、デクリメント が処理され、直ちに関数が戻ります。セマフォー が現在値0を有する場合、呼び出しは、 がデクリメントを実行することができる(すなわち、セマフォ値 がゼロより上に上昇する)か、または信号ハンドラがコールを中断するまでブロックする。 – Yves
"セマフォの値が現在ゼロであれば、呼び出しはブロックされます..."と表示されます。ブロックはここで何を意味しますか? – Yves