2012-01-20 9 views
0

これは、シグナルを待つ条件変数を設定していてもwhileループから飛び出ることのできないpthreadコードです。条件信号を受信した後にループを飛び越すことができないpthreadプログラム

何か助けていただければ幸いです。

#include <pthread.h> 
    #include <iostream> 
    using namespace std; 

    pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER; 

    int counter = 0; int WATCHCOUNT = 12 ;int totalCount = 10 ; 
    int threadsID[3] = {0,1,2}; 
    pthread_cond_t cout_theashold_cv = PTHREAD_COND_INITIALIZER ; 

    void* watchCount(void *a) ; 

    void* increaseCount(void *a) 
{ 
for (int i =0; i < totalCount ; ++i) 
{ 
    pthread_mutex_lock(&myMutex); 
    ++counter ;   

    cout << "I am thread " << *((int *)a) << " I increase count to " << counter << endl ; 
    if (counter == WATCHCOUNT) 
    { 
     cout << "I am thread " << *((int *)a) << " I am before send signal with counter as " << counter << endl ; 
     pthread_cond_signal(&cout_theashold_cv); 
    } 
    pthread_mutex_unlock(&myMutex); 
    } 
} 

    int main() 
    { 
    pthread_t threads[3]; 
    pthread_create(&threads[0], NULL, increaseCount, (void *) &(threadsID[0])); 
    pthread_create(&threads[1], NULL, increaseCount, (void *) &(threadsID[1])); 
    pthread_create(&threads[2], NULL, watchCount, (void *) &(threadsID[2])); 
    for (int i = 0 ; i < 3 ; ++i) 
    { 
     pthread_join(threads[i], NULL); 
    } 
    return 0 ; 

} 
    // wait for cond var 
    void* watchCount(void *a) 
    { 
     pthread_mutex_lock(&myMutex); 
     cout << "I am thread " << *((int *)a) << " I am watching count " << counter << endl ; 

    //while (counter <= WATCHCOUNT) 
    while (counter <= INT_MAX) 
    { 
     cout << "I am thread " << *((int *)a) << " before watch count current count is " << counter << endl ; 
    pthread_cond_wait(&cout_theashold_cv, &myMutex); 

    break ; 

    cout << "I am thread " << *((int *)a) << " after watch count current count is " << counter << endl ; 

} 

cout << "I am thread " << *((int *)a) << " after loop and watch count current count is " << counter << endl ; 

pthread_mutex_unlock(&myMutex); 
} 

答えて

1

スレッド3が条件変数の待機を開始する前に完了することがあります。

これは決して信号を受信しないことを意味します。

最初にスレッド3を開始します。 1と2を起動しようとする前に条件付きに到達して待機していることを確認してください。

ここで本当に欲しいのは、counted semaphoreです(条件変数と同じですが、signal()とwait()呼び出し)。待機よりも多くのシグナルがあった場合、スレッドは停止しません。

1

あなたのプログラムは競合状態の犠牲者です。いくつかの問題がありますが、主なものは次のように見えます:

「watchCount」を呼び出す3番目のスレッドがwait()の状態になるまでに、最初の2つのスレッドはすでにカウンタの値を渡していますシグナルが呼び出されます。したがって、スレッドが待機を開始する前にシグナルが呼び出されます。したがって、あなたの3番目のスレッドは永遠に待っています。 シグナルカウンター> = WATCHCOUNTに条件を変更すると、運がよいかもしれません。

関連する問題