【发布时间】:2018-08-26 04:12:51
【问题描述】:
我正在尝试在 C 中使用 pthread 来实现生产者/消费者问题。我有一个全局变量 int num_available 作为我的两个条件变量 fill 和 empty 的状态变量。
这是我的生产者代码,它应该可以填补工作岗位并向消费者发出信号。
void *producer(void *arg){
// Parse the arguments
struct producer_arg_struct *real_arg = (struct producer_arg_struct*) arg;
char *data = real_arg -> data;
size_t filesize = real_arg -> filesize;
// Start the producer loop
while(cur_chunk < data + filesize){
pthread_mutex_lock(&mutex);
printf("producer got lock, items: %d\n", num_available);
// Wait for consumers
while(num_available == MAX){
printf("producer: sleep\n");
pthread_cond_wait(&empty, &mutex);
}
// At least one work to fill
cur_chunk += CHUNK_SIZE;
cur_result++;
num_available++;
pthread_cond_signal(&fill);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
这是我的消费者代码,它应该完成工作并向消费者发出信号。
void *consumer(void *arg){
while(1){
pthread_mutex_lock(&mutex);
printf("consumer: got lock, item: %d\n", num_available);
while(num_available == 0){
// No works available
printf("consumer: sleep\n");
pthread_cond_wait(&fill, &mutex);
}
// Having at least one work available, do the work
num_available--;
compress(cur_chunk, cur_result);
// Signal producer
pthread_cond_signal(&empty);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
我的程序会陷入无限循环。有两种输出情况:
-
生产者先拿到锁:
producer got lock, items: 0 consumer: got lock, item: 1 consumer: got lock, item: 0 consumer: sleep consumer: sleep consumer: sleep ... -
消费者先拿到锁:
consumer: got lock, item: 0 consumer: sleep consumer: sleep consumer: sleep ...
似乎consumer() 中的pthread_cond_wait(&fill, &mutex) 调用并没有真正释放锁或让消费者进入睡眠状态。相反,它陷入了无限循环。
我应该如何解决它?任何建议将不胜感激。
【问题讨论】:
-
您至少需要在开始等待之前通知消费者。
-
发布MCVE。例如,可以像
num_available不是volatile一样简单。
标签: c multithreading concurrency locking pthreads