gpt4 book ai didi

c - 多线程消费者-生产者模型。我如何知道线程何时不忙

转载 作者:行者123 更新时间:2023-12-03 12:55:50 24 4
gpt4 key购买 nike

我有一个具有生产者-消费者模型的多线程应用程序。

基本上我有2个结构。

第一个是一个结构,其中包含要完成的工作的所有必要信息。

第二个是绑定(bind)到工作线程的结构,它包含指向第一个结构的指针。

像这样:

typedef struct worker_struct { 

/* information for the work to be done */

} worker_struct;

typedef struct thread_specs {

worker_struct *work;

unsigned short thread_id;

unsigned short pred_cond;

pthread_mutex_t busy_mutex;
pthread_cond_t work_signal;

} thread_specs;

现在这一切都很好而且花花公子,但是现在从我的制片人那里我知道需要完成哪些工作,并且我想将工作线程链接到要完成的工作。我的问题是我不知道如何确定我的工作线程当前是否忙。

我有一个带有条件等待的谓词条件,如下所示:
while ( thread_stuff->pred_cond == 0 ) {
retval = pthread_cond_wait( &(thread_stuff->work_signal), &(thread_stuff->busy_mutex);
if (retval !=0 ) {
strerror_r(retval, strerror_buf, ERRNO_BUFSIZE);
printf("cond wait error! thread: %u, error: %s\n", thread_stuff->thread_id, strerror_buf);
}
}

现在如何确保线程不忙。如果我在它从信号中唤醒后设置了一个受互斥锁保护的变量,我会得到一个竞争条件,因为我不能保证在我的消费者再次检查等待线程之前变量被设置。

我看到我能做的唯一方法是做一个 pthread_mutex_trylock()使用与条件等待相结合的相同互斥锁在其上,但这似乎有点昂贵且不优雅。

有没有其他方法,更好的方法来做这样的事情,即判断一个线程当前是否正在等待谓词条件?

问候

最佳答案

在典型的生产者-消费者关系中,生产者和消费者之间是断开连接的,并通过一些共享数据结构(例如 FIFO 队列)进行通信。生产者创建作业并将它们放置在队列中。消费者从队列中移除项目并处理它们。所以生产者不需要知道是否有可用的消费者。他们只是排队一个工作,下一个可用的消费者会拿起它。

这样的设计使得添加或删除生产者或消费者变得容易,因为它们可以相互独立。

如果您需要某项作业当前正在处理或已完成的信号,您通常会使用某种信号机制,例如事件。

如果您想限制已安排但尚未处理的工作项的数量,您将限制 FIFO 队列的大小。

关于c - 多线程消费者-生产者模型。我如何知道线程何时不忙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24437213/

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