我创建了一个简单的程序,它使用条件变量在两个线程之间创建同步。我得到一个奇怪的输出,我似乎找不到解决方案。
程序所做的是,在生成器线程中,生成 1000 个随机整数并检查它们是否是完全平方。如果该数字是一个完美的平方,那么它会向监视器线程发出信号,该线程打印该数字的平方根。
我遇到的问题很可能是某种竞争条件,因为当生成器发出信号时,监视器根本没有打印出平方根。
奇怪的是,当我在 gdb b 中调试时,每次变量is_square
更改时单步执行,问题都不存在。
任何见解将不胜感激。我觉得这与我的互斥锁或条件放置有关。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <pthread.h>
#include <time.h>
int square_root;
int is_square = 0;
int done = 0;
int count = 0; //used to count how many perfect squares generator_func finds
int count1 = 0; //used to compare how many responses monitor makes to signal
pthread_mutex_t mutex;
pthread_cond_t mon;
void* generator_func(void* args){
srand(time(NULL));
int i, temp, sq;
for(i = 0; i<1000; i++){
temp = rand() % 10000;
sq = sqrt((double)temp);
if((pow(sq,2)) == temp){
pthread_mutex_lock(&mutex);
count++;
square_root = sq;
is_square = 1;
fprintf(stderr, "Square root of %d is", temp);
pthread_cond_signal(&mon);
pthread_mutex_unlock(&mutex);
}
}
pthread_mutex_lock(&mutex);
done = 1;
is_square = -1;
pthread_cond_signal(&mon);
pthread_mutex_unlock(&mutex);
}
main(){
pthread_t generator; //declare thread
pthread_mutex_init(&mutex, NULL); //initialize mutex
pthread_cond_init(&mon, NULL); //initialize condition variable
pthread_create(&generator, NULL, generator_func, NULL); //create thread
//monitor
while(done != 1){
pthread_mutex_lock(&mutex);
while(is_square == 0){
pthread_cond_wait(&mon, &mutex);
}
if(is_square == 1 && done != 1){
count1++;
fprintf(stderr, " %d\n", square_root);
is_square = 0;
}
pthread_mutex_unlock(&mutex);
}
pthread_join(generator, NULL);
printf("%d %d\n", count, count1); //shows inconsistency between generator and monitor
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&mon);
}