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

Choice of semaphores, mutexes and condition variables

本文关键字:条件 变量 选择 信号量      更新时间:2023-10-16

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

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

条件变量的std::mutex是必需的,以防止在更改基础值时出现争用条件。