交换缓冲区而不锁定单个生产者和多个使用者
Swapping buffers without locks in single producer and multiple consumers
我们有数据将定期更新的用例。但是会有多个线程读取数据。因此,我们正在考虑的解决方案是使用双缓冲区。因此,使用者线程将读取前台页面,而生产者将更新背景页面。一旦生产者更新了背景页面,它将把前景页面与此页面交换,而不会锁定。由于数据将相同或不同,我们仍然不在乎,因为它不会影响操作。现在的问题是如何完成这项工作,因为我知道传统的生产者消费者问题,我可以为同一工作使用两个缓冲区并继续轮换东西,但要交换的问题我需要有一个锁,但这就是我们想要避免的。
那么如何执行这些事情。这方面的任何指针都会很棒。
从技术上讲,实际交换可以通过以下方式执行:
- C++11 原子函数 - 例如
std::atomic_echange
、std::atomic_exchange_explicit
- 内联组件 - 例如英特尔
lock xchg
- GCC 内置函数 -
__atomic_exchange
或更早的__sync_lock_test_and_set
- MSVC 函数 -
InterlockedExchangePointer
相关文章:
- 消费者和生产者问题的双重缓冲
- 生产者使用者在 cpp 中使用互斥锁的问题
- 如何降低生产者获得锁的可能性,而消费者在使用std::condition_variable时无法获得锁?
- 用于免等待生产者和阻塞使用者的环形缓冲区
- 具有单个生产者单一使用者的无锁循环缓冲区
- C++生产者使用者中,同一使用者线程会抓取所有任务
- 如何将第二个使用者添加到基于 pthread 的生产者-使用者设置中?
- 生产者/使用者,如何确保在关闭所有使用者之前耗尽线程安全队列
- 交换缓冲区而不锁定单个生产者和多个使用者
- 经典生产者使用者线程
- 生产者-使用者日志文件输出重复
- 使用条件变量的生产者和使用者线程
- 生产者和使用者函数,用于在操作手册中测试C++并发的线程安全堆栈示例
- C++ - 生产者/使用者仅允许在定义的块中使用
- 使用 sleep() 时,生产者使用者(使用监视器)代码不起作用
- 使用提升线程和循环缓冲区挂起的生产者/使用者
- 为什么某些线程池实现不使用生产者和使用者模型
- Win32线程生产者更新使用者线程
- 如何在生产者-使用者方案中使用提升条件变量
- C++ 中的线程安全生产者/使用者模式