c++ - 信号量、互斥体和条件变量的选择

标签 c++ multithreading synchronization producer-consumer

我有一个生产者线程和一个消费者线程,生产者是实时的并且对确定性敏感。

因此,我决定使用无锁 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/

相关文章:

c++ - 是否可以根据来自另一个 vector 的信息从一个 vector 中删除某些元素?

c++ - 如何使子控件处理父 CView 的加速器命令

c# - 线程问题

multithreading - 不变的数据和锁定

Java初学者: cost of threading over serial

node.js - 确保最准确的同步

C++ 对每个新对象使用相同的 default_random_engine

c++ - 如何在 C++ 中调试 WM_PAINT 中的代码?

java 生产者消费者问题-让线程等待其他线程完成后再完成

c# - 在 async/await 中使用 ThreadStatic 变量