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.これはこの種の私の最初の投稿であり、私は明らかに初心者ですので、許してください。 :)このから
Tony The Tigerによると、FUNCTIONでmutexをロックしても、条件変数( 'countR')**が待っていても値を確認してください。 'pthread_cond_wait'を呼び出す前であっても、すでに条件が満たされている可能性があります。実際に進んで' pthread_cond_wait'を呼び出すと、無限の待機につながります。 –
未登録のアカウントを登録済みのアカウントにマージしました。あなたは今あなたの質問をもう一度所有しています。 –
ありがとう!それはとても役に立ちました。 –