线程安全计数器c++11
Thread safe counter c++11
我正在尝试实现一个int
计数器,该计数器总是由一个线程(Thread1)
递增,而总是由另一个线程(Thread2)
递减。
一种选择是使用CCD_ 4。
虽然我有另一个想法,我有两个变量,比如counterIncr
和counterDecr
。Thread1
总是递增counterIncr
,而Thread2总是递减counterDecr
。
我将使用(counterIncr+counterDecr)
的和作为我的最终结果。
这有性能优势吗?这是免费的吗?
如果您需要一个在任何时候都可以访问的结果,那么使用std::atomic
是正确的做法,如果您只需要"一个计数器",那么std::memory_order_relaxed
就足够了,这是相当有效的
但是,请注意,您仍然有显著的总线开销,因此,如果您进行数百万次增量,这可能会成为一个限制因素。不要这样做,除非你只期望总共几百个左右的增量(在这种情况下,这无关紧要),或者除非你真的需要随时读取值。
如果在进行多次计算后需要最终结果,则更可取的做法是连接两个线程(或阻止它们,或向主线程发出您已完成并不再写入计数器的信号),并让每个线程非原子地仅更新一个每线程计数器。您可以使用引用或逐引用lambda捕获,这样消耗线程就可以"轻松"访问结果
这不会冲击公交车,而且会跑得更快,但当然,你只能在最后得到一个有效的结果,而不是之前的任何时候。
相关文章:
- 循环在计数器中不起作用
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- python集合的C++等价物是什么.计数器
- C++中的VLA,扩展名为std=C++11
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 如何使用lock_guard在c++11中实现scoped_lock功能
- C++11 中不同类型的对象的 std::array 的替代方案
- C++11:参数包扩展计数器
- 在C++11中实现共享整数计数器而不使用互斥的最简单方法:
- TinyThread计数器 - 便携式c++0和c++11线程间通信变得简单
- 线程安全计数器c++11
- C++11共享Ptr,共享相同的参考计数器
- C++11中的数据竞赛、UB和计数器