gpt4 book ai didi

c - 使用 pthread 的生产者-消费者中的死锁

转载 作者:行者123 更新时间:2023-11-30 14:53:40 25 4
gpt4 key购买 nike

我正在使用 pthreads 来解决生产者-消费者问题。基本上,生产者将文件读取到缓冲区,而消费者(至少一个,但不限于)从缓冲区获取条目并一一操作它们。这是制作人:

//...Local stuff...
if(file){
while(fgets(line, 256, file)){
pthread_mutex_lock(&buffer_mutex);
while(data->buffer->buffer_items == data->buffer->buffer_size){
pthread_cond_wait(&buffer_full_cv, &buffer_mutex);}
data->buffer->buffer_items);
reads++;
add_to_head(data->buffer, line);
pthread_cond_broadcast(&buffer_ready_cv);
pthread_mutex_unlock(&buffer_mutex);
}
pthread_mutex_lock(&buffer_mutex);
work = 0;
pthread_mutex_unlock(&buffer_mutex);
fclose(file);
}

这就是消费者:

//...Local stuff...
while(1){
pthread_mutex_lock(&buffer_mutex);
while(data->buffer->buffer_items == 0){
if(work)
pthread_cond_wait(&buffer_ready_cv, &buffer_mutex);
else if(!work && !data->buffer->buffer_items)
pthread_exit(NULL);
}
remove_from_tail(data->buffer, string_to_check);
data->buffer->buffer_items);
pthread_cond_signal(&buffer_full_cv);
pthread_mutex_unlock(&buffer_mutex);

for(unsigned int i = 0; i < data->num_substrings; i++){
cur_occurrence = strstr(string_to_check, data->substrings[i]);
while(cur_occurrence != NULL){
pthread_mutex_lock(&buffer_mutex);
data->occurrences[i]++;
cur_occurrence++;
cur_occurrence = strstr(cur_occurrence, data->substrings[i]);
pthread_mutex_unlock(&buffer_mutex);
}
}
}

似乎发生的情况是文件已完全读取,并且仍有工作要做,但由于生产者不再运行,消费者中的等待永远不会完成。

PS.: I've also tried pthread_cond_signal instead of broadcast, but didn't work either.

无论如何,我在这里缺少什么吗?

最佳答案

What seems to be happening is the file is completely read and there's still work to be done, but as the producer is not running anymore, the wait in the consumer never finishes.

从技术上来说,这并不是一个僵局。这是生产者/消费者线程配置的常见挑战。有多种方法可以解决这个问题。

  • 您可以使用一个特殊的缓冲区值(与空缓冲区分开)来表明生产者已完成。 (如果您有多个消费者,则必须将这个特殊值保留在缓冲区中。)这种带内信令虽然有时易于实现,但通常不是一个好的设计。
  • 如果您有多个生产者,您可能应该将缓冲区与正在运行的生产者数量的计数器结合起来,本质上是向缓冲区添加一个信号量。如果生产者数量为零,则消费者需要退出。
  • 生成生产者和消费者的线程可以在加入所有消费者后使用pthread_cancel,以便中止pthread_cond_wait。不过,要完全正确这一点很棘手,而且一般情况下最好避免取消。

请注意,如果您有多个消费者,每个消费者都需要在观察到已达到数据结束状态后广播该信号,以便其他消费者也有机会观察到它,

关于c - 使用 pthread 的生产者-消费者中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47107738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com