我正在尝试实现一个int
计数器,该计数器总是递增一个线程(Thread1)
并且总是递减另一个(Thread2)
。
一个选项是使用std::atomic<int>
。
虽然我有另一个想法,我有两个变量说counterIncr
和counterDecr
。
Thread1
总是递增counterIncr
,而Thread2总是递减counterDecr
。
我将使用(counterIncr+counterDecr)
的总和作为我的最终结果。
这有什么性能优势吗?这是等待吗?
答案 0 :(得分:3)
如果您需要随时可访问的结果,使用std::atomic
是正确的做法,如果&#34;只是一个计数器&#34;就是你所需要的,std::memory_order_relaxed
就足够了,这是合理有效的
但请注意,您仍然有重要的总线开销,因此如果您执行数百万的增量,这可能会成为一个限制因素。不要这样做,除非你只想要几百个左右的增量(在这种情况下它并不重要),或者除非你真的需要能够随时读取值。
如果在进行多次计算后需要最终结果,那么加入两个线程(或阻止它们,或者发出主线程表示你已经完成并且不再写入)是非常优选的到计数器)并让每个线程只更新一个每线程计数器非原子。您可以使用引用或每引用lambda捕获,以便消费线程具有简单的&#34; easy&#34;访问结果。
这不会破坏公共汽车并且运行速度会快很多,但当然你最后只有一个有效的结果,而不是在此之前的任何时间。