我正在努力使用pthreads的程序。以下是我遇到困难的代码的简化版本:
#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 :(得分:2)
由此:
pthread_cond_wait()和pthread_cond_timedwait()函数是 用于阻止条件变量。它们用互斥锁调用 由调用线程锁定或将导致未定义的行为。
我理解在调用此函数时应该锁定互斥锁,从您的代码我可以看到很可能不是这种情况。使用互斥锁解锁时调用未定义的行为。
答案 1 :(得分:1)
您似乎在一个接一个地在同一个内存位置创建多个线程(如果numb_count
大于thread_count
)。该代码还有许多其他错误 - 您几乎不应该使用pthread_exit
(几乎从不使用exit()
),而是使用pthread_join
。