线程安全计数器c++11

Thread safe counter c++11

本文关键字:c++11 计数器 安全 线程      更新时间:2023-10-16

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

一种选择是使用CCD_ 4。

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

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

这有性能优势吗?这是免费的吗?

如果您需要一个在任何时候都可以访问的结果,那么使用std::atomic是正确的做法,如果您只需要"一个计数器",那么std::memory_order_relaxed就足够了,这是相当有效的
但是,请注意,您仍然有显著的总线开销,因此,如果您进行数百万次增量,这可能会成为一个限制因素。不要这样做,除非你只期望总共几百个左右的增量(在这种情况下,这无关紧要),或者除非你真的需要随时读取值。

如果在进行多次计算后需要最终结果,则更可取的做法是连接两个线程(或阻止它们,或向主线程发出您已完成并不再写入计数器的信号),并让每个线程非原子地仅更新一个每线程计数器。您可以使用引用或逐引用lambda捕获,这样消耗线程就可以"轻松"访问结果
这不会冲击公交车,而且会跑得更快,但当然,你只能在最后得到一个有效的结果,而不是之前的任何时候。