gpt4 book ai didi

c++ - 什么对消息队列更好? mutex & cond 还是 mutex & semaphore?

转载 作者:太空狗 更新时间:2023-10-29 12:08:21 28 4
gpt4 key购买 nike

我正在实现一个基于 std::queue 的 C++ 消息队列。

因为我需要 popers 在空队列上等待,所以我考虑使用 mutex 进行互斥,并使用 cond 在空队列上挂起线程,就像 glib 对 gasyncqueue 所做的那样。

但是在我看来,互斥量和信号量可以完成这项工作,我认为它包含一个整数,而且对于处理未决消息而言,这似乎是一个相当高的数字。

信号量的优点是您不需要每次从等待返回时手动检查条件,因为您现在可以确定有人插入了一些东西(当有人插入 2 个项目并且您是第二个到达的线程时)。

你会选择哪一个?

编辑:更改了问题以回应@Greg Rogers

最佳答案

单个信号量不能完成这项工作 - 您需要比较(mutex + semaphore)(mutex + condition variable)

通过尝试实现它很容易看出这一点:

void push(T t)
{
queue.push(t);
sem.post();
}

T pop()
{
sem.wait();
T t = queue.top();
queue.pop();
return t;
}

如您所见,当您实际读取/写入队列时没有互斥,即使信号量(来自信号量)存在。多个线程可以同时调用 push 打断队列,也可以多个线程同时调用 pop 打断队列。或者,一个线程可以调用 pop 并删除队列的第一个元素,而另一个线程调用 push。

您应该使用您认为更容易实现的任何一个,我怀疑性能是否会有很大差异(尽管测量可能很有趣)。

关于c++ - 什么对消息队列更好? mutex & cond 还是 mutex & semaphore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1466940/

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