我有一个生产者线程和一个消费者线程,生产者是实时的并且对确定性敏感。
因此,我决定使用无锁 fifo 队列将处理从生产者线程提升到消费者线程中。目标是让消费者既能做出响应,又能避免忙等待,同时永远不会延迟生产者不确定的时间;因此,任何分配/锁定(我想还有内核条目?)等都是完全不可能的。
我已经实现了这种模式,看起来效果很好,但是我不确定为什么需要互斥体:
std::mutex m;
std::condition_variable cv;
void consumer()
{
std::unique_lock<std::mutex> lock(m);
while (1)
{
cv.wait(lock);
// process consumation...
}
}
void producer()
{
while (1)
{
// produce and post..
cv.notify_one();
}
}
其他规范示例似乎也将互斥体锁定在生产者中,为什么?我的数据通信已经是线程安全的,所以不需要这样做。另外,这是否容易丢失信号?
在研究这个问题时,我偶然发现了似乎明确用于这种情况的信号量。与该系统相比有什么好处?我目前更喜欢我的解决方案,只是因为它是标准库的一部分。
最佳答案
信号量和条件变量在某种程度上是相似的概念。至少当前的 C++ 标准库本身无法提供经典的计数信号量。但这些可以轻松地用 std::condition_variable
替换。控制一个 in-/decrement 整数值。
条件变量的 std::mutex
是必要的,以防止更改基础值时出现竞争条件。
关于c++ - 信号量、互斥体和条件变量的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31660596/