我有一个程序,该程序使用多线程进行一些计算并将结果添加到全局变量中。还有一个计数器,用于指示已经完成了多少线程以及仍在运行多少线程。线程已分离。除了这些线程之外,还有一个输出线程可以识别另一个线程是否更改了这些全局变量之一。如果是这样,它将打印它们。输出线程也等待被动。
如何使输出线程等待全局值的更改?我可以做一个while循环,直到所有线程完成,然后观察值的改变,但这并不是我真正想要的。我希望输出线程被动地等待。
sem_t sem;
int val1 = 0;
int val2 = 0;
int active = 0;
int finish = 0;
void* calc(void* arg){
sem_wait(&sem);
calculate(arg);
++finish;
sem_post(&sem);
return NULL;
}
void* out(void* arg){
//what to do here?
printf();
return NULL;
}
int main(int argc, char* argv[]){
pthread_t calcThread;
int somevalue;
sem_init(&sem, 0, argv[1]); // max amount of threads running simultaniously
for(int i = 2; i != argc; i++){
somevalue = atoi(argv[i]);
pthread_create(&calcThread, NULL, calc, &somevalue))
pthread_detach(calcThread);
}
}
使用sleep()函数是一种解决方法。
while( finish == 0 )
sleep(1);
此外,我还要在calc()或sem_post()函数中添加一些检查机制,以便在打印值之前不会覆盖它们。
if( finish > 0 )
sleep(1);
应该工作。
建议:
使用一两个互斥锁