2016-07-26 5 views
1

私はAS TANENBAUMのModern Operation Systemsという本を読んでおり、以下のように条件変数を説明する例を示します。私にはデッドロックがあり、私が見逃していることが分かりません。mutexのデッドロック、条件変数コード?

消費者スレッドが最初に開始します。 の直後にthe_mutexがロックされています。コンシューマ条件変数の待機中にスレッドがブロックされました。condc

プロデューサーは、この時点で実行されている場合消費者がそれを解放したことがないので、the_mutexはまだ、ロックされます。したがってプロデューサもブロックされます。

これは教科書のデッドロックの問題です。私はここで何かを逃しましたか? THX

#include <stdio.h> 
#include <pthread.h> 

#define MAX 10000000000   /* Numbers to produce */ 
pthread_mutex_t the_mutex; 
pthread_cond_t condc, condp; 
int buffer = 0; 


void* consumer(void *ptr) { 
    int i; 

    for (i = 1; i <= MAX; i++) { 
    pthread_mutex_lock(&the_mutex); /* lock mutex */ 

    /*thread is blocked waiting for condc */ 
    while (buffer == 0) pthread_cond_wait(&condc, &the_mutex); 
    buffer = 0; 
    pthread_cond_signal(&condp);  
    pthread_mutex_unlock(&the_mutex); 
    } 
    pthread_exit(0); 
} 

void* producer(void *ptr) { 
    int i; 

    for (i = 1; i <= MAX; i++) { 
    pthread_mutex_lock(&the_mutex); /* Lock mutex */ 

    while (buffer != 0) pthread_cond_wait(&condp, &the_mutex); 
    buffer = i; 
    pthread_cond_signal(&condc);  
    pthread_mutex_unlock(&the_mutex); 
    } 
    pthread_exit(0); 
} 

int main(int argc, char **argv) { 
    pthread_t pro, con; 

    //Simplified main function, ignores init and destroy for simplicity 
    // Create the threads 
    pthread_create(&con, NULL, consumer, NULL); 
    pthread_create(&pro, NULL, producer, NULL); 
} 

答えて

3

あなたが条件変数を待って、関連するミューテックスは(あなたがpthread_cond_waitのためにmutexを渡す理由です)待機の期間中にリリースされます。

pthread_cond_waitが返ってくると、mutexは常に再びロックされます。

この点に留意して、この例のロジックに従うことができます。

関連する問題