在单个生产者和多个使用者中交换没有锁的缓冲区

时间:2012-11-30 11:30:33

标签: c++ c pthreads producer-consumer

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

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

1 个答案:

答案 0 :(得分:1)

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

  • C ++ 11原子功能 - 例如std::atomic_echangestd::atomic_exchange_explicit
  • 内联汇编 - 例如英特尔lock xchg
  • GCC内置函数 - __atomic_exchange或更早版__sync_lock_test_and_set
  • MSVC函数 - InterlockedExchangePointer