2017-08-11 4 views
1

トピックを検索したときに、コードがhereから見つかりました。ご覧のように、両方の関数のスレッドは同じmutexを使用します。それで、たとえ先のスレッドがmutexを所有していても、他のスレッドに信号を送るか、信号を捕まえてその機能を続けることができますか?どのようにデッドロックがないのですか?それはちょっと混乱します。Pthread条件変数とデッドロックなし

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

pthread_mutex_t count_mutex  = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t condition_var = PTHREAD_COND_INITIALIZER; 

void *functionCount1(); 
void *functionCount2(); 
int count = 0; 
#define COUNT_DONE 10 
#define COUNT_HALT1 3 
#define COUNT_HALT2 6 

main() 
{ 
    pthread_t thread1, thread2; 

    pthread_create(&thread1, NULL, &functionCount1, NULL); 
    pthread_create(&thread2, NULL, &functionCount2, NULL); 

    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 

    printf("Final count: %d\n",count); 

    exit(EXIT_SUCCESS); 
} 

// Write numbers 1-3 and 8-10 as permitted by functionCount2() 

void *functionCount1() 
{ 
    for(;;) 
    { 
     // Lock mutex and then wait for signal to relase mutex 
     pthread_mutex_lock(&count_mutex);  //  <---- Same mutex 

     // Wait while functionCount2() operates on count 
     // mutex unlocked if condition varialbe in functionCount2() signaled. 
     pthread_cond_wait(&condition_var, &count_mutex); 
     count++; 
     printf("Counter value functionCount1: %d\n",count); 

     pthread_mutex_unlock(&count_mutex); 

     if(count >= COUNT_DONE) return(NULL); 
    } 
} 

// Write numbers 4-7 

void *functionCount2() 
{ 
    for(;;) 
    { 
     pthread_mutex_lock(&count_mutex); //  <---- Same mutex 

     if(count < COUNT_HALT1 || count > COUNT_HALT2) 
     { 
      // Condition of if statement has been met. 
      // Signal to free waiting thread by freeing the mutex. 
      // Note: functionCount1() is now permitted to modify "count". 
      pthread_cond_signal(&condition_var); 
     } 
     else 
     { 
      count++; 
      printf("Counter value functionCount2: %d\n",count); 
     } 

     pthread_mutex_unlock(&count_mutex); 

     if(count >= COUNT_DONE) return(NULL); 
    } 

} 

答えて

0

1つのスレッドが ロックを所有している場合は、他の一つは、それを解放する前に、そしてもう一つは、それを取得することはできません。
スレッドAが最初にロックを取得した場合、ロックが解放されるまでスレッドBが からクリティカルセクション内に進まないようになります。


なぜデッドロックはありませんか?


thisを読む:

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); 

この関数は、アトミックミューテックスを解放し、条件変数condをブロックする呼び出し元のスレッドを引き起こします。

スレッドAはcond_waitに当たったときにロックを解除し、スレッドBは進行して条件変数に信号を送ることができます。

+0

あなたは私が尋ねるものを理解していません。私はどちらも同じミューテックスを使用することを頼みます。もしそれらのうちの1つが許可を所有していれば、もう1つはミューテックスエリアに入るのを待たなければなりません。その場合、functionCount1では、thread1が所有するmutexとpthread_cond_waitが進行中です。この行では、functionCount2(Thread 2)を待っていますか?または、thread2がmutexを所有している場合、thread1はどのようにカウントをインクリメントできますか?ミューテックスがすでにthread2によって所有されていても? – concurrencyboy

+0

しかしデッドロックのないチャームのように機能しますか? – concurrencyboy

+0

@concurrencyboy今すぐお試しください。あなたが混乱させたのは、スレッドAが 'cond_wait'を実行するとロックを解放するという事実でした。それ以外の場合は、スレッドAが最初にロックを取得するシナリオではデッドロックになります。 –