草庐IT

c++ - 原子 bool 无法保护非原子计数器

我遇到了一个(基本)自旋锁互斥锁的问题,它似乎无法按预期工作。4个线程正在递增一个受此互斥体保护的非原子计数器。结果与预期结果不匹配,这使得互斥锁似乎被破坏了。示例输出:result:2554230expected:10000000在我的环境中,它发生在以下条件下:flag是std::atomic,任何其他内容,例如std::atomic或std::atomic_flag(与test_and_set)工作正常。使用gcc6.3.1和-O3在X86_64上编译标记我的问题是,什么可以解释这种行为?#include#include#include#include#include#inclu

c++ - 原子 bool 无法保护非原子计数器

我遇到了一个(基本)自旋锁互斥锁的问题,它似乎无法按预期工作。4个线程正在递增一个受此互斥体保护的非原子计数器。结果与预期结果不匹配,这使得互斥锁似乎被破坏了。示例输出:result:2554230expected:10000000在我的环境中,它发生在以下条件下:flag是std::atomic,任何其他内容,例如std::atomic或std::atomic_flag(与test_and_set)工作正常。使用gcc6.3.1和-O3在X86_64上编译标记我的问题是,什么可以解释这种行为?#include#include#include#include#include#inclu

c++ - 标准 C++11 是否保证 `volatile atomic<T>` 具有两种语义( volatile + 原子)?

众所周知,std::atomic和volatile是不同的东西。有两个主要区别:两个优化可以用于std::atomica;,但不能用于volatileinta;:融合操作:a=1;a=2;可以由a=2;上的编译器替换不断传播:a=1;local=a;可以由a=1;local=1;上的编译器替换跨原子/volatile操作的普通读/写重新排序:为volatileinta;任何volatile读/写操作都不能重新排序。但是附近的普通读/写仍然可以围绕volatile读/写重新排序。为std::atomica;基于用于原子操作的内存屏障限制附近普通读/写的重新排序a.load(std::me

c++ - 标准 C++11 是否保证 `volatile atomic<T>` 具有两种语义( volatile + 原子)?

众所周知,std::atomic和volatile是不同的东西。有两个主要区别:两个优化可以用于std::atomica;,但不能用于volatileinta;:融合操作:a=1;a=2;可以由a=2;上的编译器替换不断传播:a=1;local=a;可以由a=1;local=1;上的编译器替换跨原子/volatile操作的普通读/写重新排序:为volatileinta;任何volatile读/写操作都不能重新排序。但是附近的普通读/写仍然可以围绕volatile读/写重新排序。为std::atomica;基于用于原子操作的内存屏障限制附近普通读/写的重新排序a.load(std::me

c++ - 具有 std::atomic 成员变量的类的复制构造函数/赋值运算符出错

我有一个像下面这样的类(class)。#includestaticconstlongmyValue=0;classSequence{public:Sequence(longinitial_value=myValue):value_(initial_value){}private:std::atomicvalue_;};intmain(){SequencefirstSequence;SequencesecondSequence=firstSequence;return0;}我收到这样的编译错误,test.cpp:21:36:error:useofdeletedfunction‘Seque

c++ - 具有 std::atomic 成员变量的类的复制构造函数/赋值运算符出错

我有一个像下面这样的类(class)。#includestaticconstlongmyValue=0;classSequence{public:Sequence(longinitial_value=myValue):value_(initial_value){}private:std::atomicvalue_;};intmain(){SequencefirstSequence;SequencesecondSequence=firstSequence;return0;}我收到这样的编译错误,test.cpp:21:36:error:useofdeletedfunction‘Seque

c++ - std::shared_ptr 和 std::experimental::atomic_shared_ptr 有什么区别?

我阅读了followingAntonyWilliams的文章,据我了解,除了std::experimental::atomic_shared_ptr中std::shared_ptr中的原子共享计数之外指向共享对象的实际指针也是原子的?但是当我读到安东尼的书中关于C++Concurrency的lock_free_stack的引用计数版本时在我看来,同样适用于std::shared_ptr,因为应用了std::atomic_load、std::atomic_compare_exchnage_weak等函数到std::shared_ptr的实例。templateclasslock_free_

c++ - std::shared_ptr 和 std::experimental::atomic_shared_ptr 有什么区别?

我阅读了followingAntonyWilliams的文章,据我了解,除了std::experimental::atomic_shared_ptr中std::shared_ptr中的原子共享计数之外指向共享对象的实际指针也是原子的?但是当我读到安东尼的书中关于C++Concurrency的lock_free_stack的引用计数版本时在我看来,同样适用于std::shared_ptr,因为应用了std::atomic_load、std::atomic_compare_exchnage_weak等函数到std::shared_ptr的实例。templateclasslock_free_

c++ - 是否可以在 C++ 中创建原子 vector 或数组?

我有一些代码在每秒激活的线程中使用int数组(int[])。我使用std::mutex中的lock()将这个数组锁定在这个线程中。但是我想知道是否有办法创建一个原子数组(或vector)来避免使用互斥锁?我尝试了几种方法,但编译器总是以某种方式提示?我知道有一种方法可以创建原子数组,但这不一样。 最佳答案 实际上,在CPU级别,有些指令可以自动更新int,一个好的编译器会将这些用于std::atomic.相比之下,没有指令可以自动更新整数vector(对于我知道的任何架构),因此got在某处成为某种互斥体。你不妨让它成为你的互斥体。

c++ - 是否可以在 C++ 中创建原子 vector 或数组?

我有一些代码在每秒激活的线程中使用int数组(int[])。我使用std::mutex中的lock()将这个数组锁定在这个线程中。但是我想知道是否有办法创建一个原子数组(或vector)来避免使用互斥锁?我尝试了几种方法,但编译器总是以某种方式提示?我知道有一种方法可以创建原子数组,但这不一样。 最佳答案 实际上,在CPU级别,有些指令可以自动更新int,一个好的编译器会将这些用于std::atomic.相比之下,没有指令可以自动更新整数vector(对于我知道的任何架构),因此got在某处成为某种互斥体。你不妨让它成为你的互斥体。