无法理解pthread_cond_wait / signal / broadcast

时间:2016-06-04 10:56:57

标签: c++ multithreading pthreads

我正在尝试了解pthread条件。 为此,我写了一个非常基本的程序,但无论我阅读了多少手册和解释,我都无法理解它是如何工作的。

#include <iostream>
#include <pthread.h>
using namespace std;
#define NT 3
#define ITERATIONS 5

int countDone=0;
int a[NT] = {10, 20, 30};
pthread_cond_t doneCond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t doneMutex = PTHREAD_MUTEX_INITIALIZER;

void * thread_start(void* num){
    int currIt=0;

    while(currIt < ITERATIONS){
    cout << pthread_self() << "my number is " << a[(int)num] << endl;
    a[(int)num]++;

    pthread_mutex_lock(&doneMutex);
    countDone++;

    if(countDone == NT)
        pthread_cond_signal(&doneCond);

        while(countDone != 0)
            pthread_cond_wait(&doneCond, &doneMutex);
    pthread_mutex_unlock(&doneMutex);
    currIt++;
    }   
    pthread_exit(NULL);
}

int main(){
    pthread_t tidVec[NT];
    int i, currIt=0, ret;

    //creating threads
    for(i=0; i<NT; i++)
        pthread_create(&tidVec[i], NULL, &thread_start, (void*)i);

    while(currIt < ITERATIONS){ 
        cout << "---Iteration " << currIt << endl;  
        pthread_mutex_lock(&doneMutex);

        while(countDone < NT)
            pthread_cond_wait(&doneCond, &doneMutex);

        countDone = 0;
        pthread_cond_broadcast(&doneCond);
        pthread_mutex_unlock(&doneMutex);
        currIt++;
    }

    //waiting for threads termination
    for(i=0; i<NT; i++)
        pthread_join(tidVec[i], (void**)&ret);
    pthread_cond_destroy(&doneCond);
    pthread_mutex_destroy(&doneMutex);
    return 0;
}

我想要它做的是:在每次迭代时,每个线程打印在数组a中分配给自身的数字,递增值,然后递增计数器countDone(计算已完成工作的线程数)。 完成其工作的最后一个线程“告诉”主要的是它们都完成了。 main将计数器设置为零,以便可以开始新的迭代。 等等5次迭代。

我得到的输出是:

---Iteration 0
3057584960my number is 30
3065977664my number is 20
3074370368my number is 10
---Iteration 1
3057584960my number is 31

然后它被卡住了。 你能帮我弄清楚这里发生了什么吗?

谢谢。

0 个答案:

没有答案