2011-09-10 3 views
0

pthreadを使用するプログラムでは苦労します。ここで私はとの難しさを持っているコードの簡易版は、次のとおりです。しばらくの間、プログラムを使用したプログラムが動作して停止する

#include <cstdlib> 
#include <iostream> 
#include <pthread.h> 

pthread_t* thread_handles; 
pthread_mutex_t mutex; 
pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER; 
int thread_count; 
const int some_count = 76; 
const int numb_count = 5; 
int countR = 0; 

//Initialize threads 
void InitTh(char* arg[]){ 
    /* Get number of threads */ 
    thread_count = strtol(arg[1], NULL, 10); 
    /*Allocate space for threads*/ 
    thread_handles =(pthread_t*) malloc (thread_count*sizeof(pthread_t)); 
} 

//Terminate threads 
void TermTh(){ 
    for(long thread = 0; thread < thread_count; thread++) 
     pthread_join(thread_handles[thread], NULL); 
    free(thread_handles); 
} 

//Work for threads 
void* DO_WORK(void* replica) { 
    /*Does something*/ 
    pthread_mutex_lock(&mutex); 
    countR++; 
    if (countR == numb_count) pthread_cond_broadcast(&cond_var); 
    pthread_mutex_unlock(&mutex); 
    pthread_exit(NULL); 
} 

//Some function 
void FUNCTION(){ 
    pthread_mutex_init(&mutex, NULL); 
    for(int k = 0; k < some_count; k++){ 
     for(int j = 0; j < numb_count; j++){ 
      long thread = (long) j % thread_count; 
      pthread_create(&thread_handles[thread], NULL, DO_WORK, (void *)j);; 
     } 
     /*Wait for threads to finish their jobs*/ 
     while(pthread_cond_wait(&cond_var,&mutex) != 0); 
     countR = 0; 
     /*Does more work*/ 
    } 
    pthread_cond_destroy(&cond_var); 
    pthread_mutex_destroy(&mutex); 
} 


int main(int argc, char* argv[]) {  
    /*Initialize threads*/ 
    InitTh(argv); 

    /*Do some work*/ 
    FUNCTION(); 

    /*Treminate threads*/ 
    TermTh(); 

    pthread_exit(NULL); 
} 

some_count、(この特定の場合には、)76未満の場合、プログラムは正常に動作しますが、私は大きな値を指定した場合、プログラムの動作しばらくの間、そしてストールする。誰かが私が間違っていることを指摘するかもしれない?

P.S.これはこの種の私の最初の投稿であり、私は明らかに初心者ですので、許してください。 :)このから

+0

Tony The Tigerによると、FUNCTIONでmutexをロックしても、条件変数( 'countR')**が待っていても値を確認してください。 'pthread_cond_wait'を呼び出す前であっても、すでに条件が満たされている可能性があります。実際に進んで' pthread_cond_wait'を呼び出すと、無限の待機につながります。 –

+0

未登録のアカウントを登録済みのアカウントにマージしました。あなたは今あなたの質問をもう一度所有しています。 –

+0

ありがとう!それはとても役に立ちました。 –

答えて

2

pthread_cond_waitの()およびpthread_cond_timedwaitは()関数は、条件変数でブロックするために使用 あります。呼び出し元スレッドによってmutex がロックされているか、未定義の動作が発生します。

私は、この関数は、コードから、呼び出されているとき、ミューテックスが、私はこれが最も可能性が高い場合ではないことがわかりますロックする必要があります理解しています。定義されていない動作は、ロックされていないmutexで呼び出したときに発生します。

0

同じメモリ位置に複数のスレッドを作成しているようです(numb_countthread_countより大きい場合)。コードには他にも多くのバグがあります。pthread_exit(ほぼexit()もほとんど使用しません)をほとんど使用しないでください。代わりにpthread_joinを使用してください。

関連する問題