gpt4 book ai didi

linux - 单一提供者,单一消费者。哪个适合条件变量 : pthread_cond_t, sem_t 或 pthread_mutex_t?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:39:03 25 4
gpt4 key购买 nike

有:

一个条件变量“var”:var的值只能是0或1;

一个提供者线程“thP”:当从网络接收到数据时,设置 var 1(可用);

一个消费者线程“thC”:wait() for var。当得到var时,将其设置为0(不可用),然后再处理一些东西。

.

我找到了两种实现这个简单模型的方法:

(1) 使用 pthread_cond_t 作为 var。 此方法需要一个额外的互斥量和一个回调函数来解锁互斥量,同时线程将被清理。

(2) 使用 sem_t 作为 var。 该方法可能会导致“var>1”的情况。 thC 可能会执行多个 wait() 操作来将 var 的值减少到 1。

.

问题是:

要实现“单一提供者、单一消费者、一个条件变量”这一简单模型,我应该为 var、pthread_cond_t、sem_t 使用哪种类型,还是简单地使用 pthread_mutex_t 作为二进制信号量?

.

非常感谢!

最佳答案

对于单个消费者、单个提供者、有界队列示例,典型的做法是用一把锁保护两个条件变量(一个在“队列未满”时发出信号,另一个在“队列不为空”时发出信号) .

算法如下所示:

post(item):
lock;
while (queue is full):
wait(cvar_queue_not_full);
queue.push(item)
signal(cvar_queue_not_empty);
unlock;

consume():
lock;
while (queue is empty):
wait(cvar_queue_not_empty);
item = queue.shift(item);
signal(cvar_queue_not_full);
unlock;
return item;

这本质上是一个有界信号量,但允许您自动调整信号量并同时推送/弹出队列。不幸的是,POSIX 信号量是无界的,不提供原子性。

关于linux - 单一提供者,单一消费者。哪个适合条件变量 : pthread_cond_t, sem_t 或 pthread_mutex_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10326888/

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