交换缓冲区而不锁定单个生产者和多个使用者

Swapping buffers without locks in single producer and multiple consumers

本文关键字:使用者 生产者 单个 缓冲区 锁定 交换      更新时间:2023-10-16

我们有数据将定期更新的用例。但是会有多个线程读取数据。因此,我们正在考虑的解决方案是使用双缓冲区。因此,使用者线程将读取前台页面,而生产者将更新背景页面。一旦生产者更新了背景页面,它将把前景页面与此页面交换,而不会锁定。由于数据将相同或不同,我们仍然不在乎,因为它不会影响操作。现在的问题是如何完成这项工作,因为我知道传统的生产者消费者问题,我可以为同一工作使用两个缓冲区并继续轮换东西,但要交换的问题我需要有一个锁,但这就是我们想要避免的。

那么如何执行这些事情。这方面的任何指针都会很棒。

从技术上讲,实际交换可以通过以下方式执行:

  • C++11 原子函数 - 例如std::atomic_echangestd::atomic_exchange_explicit
  • 内联组件 - 例如英特尔lock xchg
  • GCC 内置函数 - __atomic_exchange 或更早的__sync_lock_test_and_set
  • MSVC 函数 - InterlockedExchangePointer