我最近使用三重缓冲区的std :: atomic将C ++ 11作为端口,用作并发同步机制。 这个线程同步方法背后的想法是,对于生产者 – 消费者的情况,你有一个运行速度更快的生产者,消费者,三重缓冲可以给一些好处,因为生产者线程不会因为等待而“放慢”为消费者。 在我的情况下,我有一个更新为〜120fps的物理线程和一个以〜60fps运行的渲染线程。 很明显,我希望渲染线程总是获得最近的状态,但是我也知道,由于速率的不同,我将跳过物理线程中的很多帧。 另一方面,我希望我的物理线程保持其不变的更新速度,而不会被较慢的呈现线程locking我的数据所限制。 原来的C代码是由remis-thoughts制作的,完整的解释在他的博客里 。 我鼓励任何有兴趣阅读的人进一步了解原始实施。 我的实现可以在这里find。 基本思想是在任何给定的时间,有一个有3个位置(缓冲区)和一个primefaces标志的数组,它们被比较和交换来定义哪个数组元素对应于什么状态。 这样,只有一个primefacesvariables用于模型数组的所有3个索引和三重缓冲背后的逻辑。 缓冲区的3个位置被命名为Dirty,Clean和Snap。 生产者总是写入脏指数,并且可以翻转书写器以将脏指数与当前的干净指数交换。 使用者可以请求一个新的Snap,它使用Clean索引交换当前的Snap索引以获得最新的缓冲区。 消费者总是在Snap位置读取缓冲区。 该标志由一个8位无符号整数组成,这些位对应于: (未使用)(新写入)(2个脏)(2个清理)(2个捕捉) 新的写额外位标志由写入器设置并由读取器清除。 读者可以使用它来检查自上次捕捉以来是否有任何写入,如果没有,则不会再捕捉。 标志和索引可以使用简单的按位操作来获得。 好的,现在的代码: template <typename T> class TripleBuffer { public: TripleBuffer<T>(); TripleBuffer<T>(const T& init); // non-copyable behavior TripleBuffer<T>(const TripleBuffer<T>&) = delete; TripleBuffer<T>& operator=(const TripleBuffer<T>&) = delete; T snap() const; // get […]
我正在阅读Java实践书籍并发 。 在第15章中,他们正在讨论非阻塞algorithm和比较与交换 (CAS)方法。 据说CAS比locking方法好得多。 我想询问那些已经同时使用这两个概念的人,并且希望听到你更喜欢哪一个概念? 它真的太快了吗? 对我来说,锁的使用更清晰,更容易理解,甚至更好维护(如果我错了,请纠正我) 。 我们是否真的应该专注于创build与CAS相关的并发代码而不是锁,以获得更好的性能提升,还是可持续性更重要? 我知道有什么时候使用什么可能没有严格的规定。 但是我想听听一些关于CAS新概念的意见和经验。