线程安全计数器c ++ 11

时间:2015-11-14 18:53:27

标签: c++ multithreading c++11

我正在尝试实现一个int计数器,该计数器总是递增一个线程(Thread1)并且总是递减另一个(Thread2)

一个选项是使用std::atomic<int>

虽然我有另一个想法,我有两个变量说counterIncrcounterDecrThread1总是递增counterIncr,而Thread2总是递减counterDecr

我将使用(counterIncr+counterDecr)的总和作为我的最终结果。

这有什么性能优势吗?这是等待吗?

1 个答案:

答案 0 :(得分:3)

如果您需要随时可访问的结果,使用std::atomic是正确的做法,如果&#34;只是一个计数器&#34;就是你所需要的,std::memory_order_relaxed就足够了,这是合理有效的 但请注意,您仍然有重要的总线开销,因此如果您执行数百万的增量,这可能会成为一个限制因素。不要这样做,除非你只想要几百个左右的增量(在这种情况下它并不重要),或者除非你真的需要能够随时读取值。

如果在进行多次计算后需要最终结果,那么加入两个线程(或阻止它们,或者发出主线程表示你已经完成并且不再写入)是非常优选的到计数器)并让每个线程只更新一个每线程计数器非原子。您可以使用引用或每引用lambda捕获,以便消费线程具有简单的&#34; easy&#34;访问结果。
这不会破坏公共汽车并且运行速度会快很多,但当然你最后只有一个有效的结果,而不是在此之前的任何时间。