信号量、互斥体和条件变量的选择
Choice of semaphores, mutexes and condition variables
我有一个生产者线程和一个消费者线程,生产者是实时的,对确定性敏感。
因此,我决定使用无锁 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
是必需的,以防止在更改基础值时出现争用条件。
相关文章:
- 基于模板值的条件变量
- 没有超时的C++条件变量
- 在条件变量中触发错误信号的频率是多少
- 在通知提升间处理条件变量时未按住锁会导致问题
- 通知条件变量后使用互斥锁
- 滥用条件变量
- 升压插值条件变量可以虚假唤醒吗?
- 子线程中的条件变量等待停止主线程中的执行
- 条件变量基本示例
- 正在连接的等待条件变量的线程会发生什么情况?
- C++11如何在1个线程中使用条件变量处理2个线程安全队列
- 当线程处理不同的类时,应该在哪里声明条件变量、互斥对象
- 为什么在同一条件变量上使用多个互斥锁会使此代码崩溃?
- 条件变量:wait_for.gcc错误
- 如何"stop"正在等待条件变量的分离线程?
- 如何杀死被条件变量锁定的线程?
- 使用互斥锁和条件变量作为成员时如何修复"use of deleted function"?
- C++ 多个使用者线程卡在条件变量上
- POSIX 条件变量和互斥体"竞争"
- 将cpp_redis pub/sub与条件变量一起使用时出现问题