使用phreads的程序可以工作一段时间然后停止

时间:2011-09-10 08:51:34

标签: c++ pthreads

我正在努力使用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。这是我的第一篇此类帖子,我显然是新手,所以请原谅。 :)

2 个答案:

答案 0 :(得分:2)

由此:

  

pthread_cond_wait()和pthread_cond_timedwait()函数是   用于阻止条件变量。它们用互斥锁调用   由调用线程锁定或将导致未定义的行为。

我理解在调用此函数时应该锁定互斥锁,从您的代码我可以看到很可能不是这种情况。使用互斥锁解锁时调用未定义的行为。

答案 1 :(得分:1)

您似乎在一个接一个地在同一个内存位置创建多个线程(如果numb_count大于thread_count)。该代码还有许多其他错误 - 您几乎不应该使用pthread_exit(几乎从不使用exit()),而是使用pthread_join