2016-12-14 3 views
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); 
} 

セマフォの仕組みを理解しようとしています。
ブロックをtd1td2を待つようにしようとしています。
なぜsem_waitブロックではないのですか?

私の意見では、sem_waitは2回ブロックされます。 func_thread1func_thread2sem_postが実行された場合は、func_thread3を続行できます。

mainに追加しないと機能しません。 sem_waitがブロックできるので、参加は必要ないと思います。

したがってpthread_joinが必要ですか、またはセマフォを間違って使用していますか?

答えて

0

pthread_joinは、実装に必須です。

それ以外の場合は、スレッド3が何かを印刷する前にプロセスが終了する(つまりmainが返されます)、すべてのタスク(つまりスレッド)が強制終了されます。

+0

http://man7.org/linux/man-pages/man3/sem_wait.3.html – Yves

+0

sem_wait()は、semが指すセマフォをデクリメント(ロック)します。 セマフォの値が0より大きい場合、デクリメント が処理され、直ちに関数が戻ります。セマフォー が現在値0を有する場合、呼び出しは、 がデクリメントを実行することができる(すなわち、セマフォ値 がゼロより上に上昇する)か、または信号ハンドラがコールを中断するまでブロックする。 – Yves

+0

"セマフォの値が現在ゼロであれば、呼び出しはブロックされます..."と表示されます。ブロックはここで何を意味しますか? – Yves

関連する問題