选择信号量,互斥量和条件变量

时间:2015-07-27 18:29:43

标签: 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();
    }
}

其他规范的例子似乎也锁定了制作人的互斥量,为什么?我的数据通信已经是线程安全的,因此不需要这样做。此外,这是否容易丢失信号?

在研究这个问题时,我偶然发现了似乎明确用于这种情况的信号量。与此系统相比有哪些好处?我现在更喜欢我的解决方案,因为它是标准库的一部分。

1 个答案:

答案 0 :(得分:2)

信号量条件变量在某种程度上是类似的概念。至少经典的计数信号量本身不能从当前的c ++标准库中获得。但是这些可以很容易地被std::condition_variable替换为控制输入/递减的整数值。

条件变量的std::mutex是必要的,以便在更改基础值时防止竞争条件。