【问题标题】:Swapping buffers without locks in single producer and multiple consumers在单个生产者和多个消费者中交换没有锁的缓冲区
【发布时间】:2012-11-30 11:30:33
【问题描述】:

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

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

【问题讨论】:

  • 如何同步生产者和消费者?当生产者决定交换并开始写入同一页面时,消费者读取前台页面会发生什么?
  • 我们不担心生产者和消费者的同步,因为前台和后台数据几乎相同。由于我们将使用索引,因此可能会出现一些消费者会阅读旧页面而一些消费者会阅读新页面但后来所有消费者都会阅读公共数据的情况。唯一的事情是我们正在寻找在交换数据时我们不想要锁。所以它寻求缓冲区的无锁切换。

标签: c++ c pthreads producer-consumer


【解决方案1】:

从技术上讲,实际的交换可以通过:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2016-06-29
    • 2011-03-21
    相关资源
    最近更新 更多