我正在尝试了解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
然后它被卡住了。 你能帮我弄清楚这里发生了什么吗?
谢谢。