问题标签 [stdatomic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 获取/释放与顺序一致的内存顺序
对于任何std::atomic<T>
T 是原始类型的地方:
如果我盲目地使用std::memory_order_acq_rel
for fetch_xxx
operations 和std::memory_order_acquire
for load
operation 和std::memory_order_release
for store
operation (我的意思是就像重置这些函数的默认内存顺序一样)
- 结果是否与我
std::memory_order_seq_cst
对任何声明的操作使用(默认使用)相同? - 如果结果相同,那么
std::memory_order_seq_cst
在效率方面,这种用法与使用有何不同?
multithreading - C++ 中对象的 volatile 关键字
我有一个线程安全的计数器对象(它是一个使用 std::atomic load() 和 store() 的类)作为类成员之一。线程 1 递增计数器,线程 2 读取计数器。
通常,由不同线程共享的原始类型( int 等)被声明为 volatile 以防止任何编译器优化。我是否必须将这个由 2 个不同线程共享的线程安全计数器对象声明为 volatile ?
有人可以对此提供更多见解吗?
c++ - c++ 11 std::atomic_flag,我使用正确吗?
我有一个简单的布尔值,需要以线程安全的方式进行测试和设置。如果一个线程已经在工作,我希望第二个线程退出。如果我理解std::atomic_flag
正确,这应该可以正常工作。但是,我不确定我理解std::atomic_flag
正确:) 我似乎无法在网上找到很多简单的示例,除了这个自旋锁示例:
更新:根据以下建议更新了代码,形成了正确使用std::atomic_flag
. 谢谢大家!
c++ - C++11 memory_order_acquire 和 memory_order_release 语义?
http://en.cppreference.com/w/cpp/atomic/memory_order和其他 C++11 在线参考资料,将 memory_order_acquire 和 memory_order_release 定义为:
- 获取操作:当前线程中的任何读取都不能在此加载之前重新排序。
- 释放操作:当前线程中的任何写入都不能在此存储之后重新排序。
这似乎允许在获取操作之前执行获取后写入,这对我来说似乎很奇怪(通常的获取/释放操作语义限制了所有内存操作的移动)。
相同的在线资源(http://en.cppreference.com/w/cpp/atomic/atomic_flag)建议可以使用 C++ 原子和上述宽松的内存排序规则构建自旋锁互斥锁:
有了这个锁定/解锁的定义,如果 memory_order_acquire/release 确实以这种方式定义(即,不禁止重新排序后获取写入),下面的简单代码不会被破坏:
是否可以执行以下操作:(0) lock, (1) x = 1, (5) x = 0, (2) PANIC ?我错过了什么?
c++ - 我什么时候真的需要使用原子而不是布尔?
因为本质上是原子的,所以不是atomic<bool>
多余的吗?bool
我认为不可能有部分修改的 bool 值。我什么时候真的需要使用atomic<bool>
而不是bool
?
c++ - 如果您必须检查溢出或有条件地采取行动,std::atomic 是多余的吗?
例如,您可以安全地递增和递减 std::atomic_int。但是,如果您需要检查溢出或根据值有条件地执行一些例程,那么无论如何都需要锁定。由于您必须比较该值,并且线程可能在比较成功后立即被交换,另一个线程修改,......错误。
但是如果你需要一个锁,那么你可以只使用一个普通的整数而不是原子的。我对吗?
c++ - 是否 std::atomic适当地工作?
我正在阅读 Anthony Williams 的“C++ Concurrency in Action”和第 5 章,其中讨论了新的多线程感知内存模型和原子操作,他说:
为了
std::atomic<UDT>
用于一些用户定义的UDT
,这个类型必须有一个普通的复制赋值操作符。
据我了解,这意味着std::atomic<UDT>
如果以下返回 true,我们可以使用:
按照这种逻辑,我们不应该将其std::string
用作模板参数std::atomic
并使其正常工作。
但是,以下代码编译并运行并显示预期输出:
这是一种未定义行为的情况,只是恰好按预期运行吗?
提前致谢!
c++ - 放松的原子规则有什么(轻微的)区别?
在看到 Herb Sutters关于“原子武器”的精彩演讲后,我对“轻松原子”示例感到有些困惑。
我认为C++ 内存模型中的原子(SC-DRF = Sequentially Consistent for Data Race Free)在加载/读取时执行“获取”。
我知道对于负载 [和商店],默认值是std::memory_order_seq_cst
,因此两者是相同的:
到目前为止一切顺利,没有涉及轻松原子(在听完演讲后,我永远不会使用轻松的原子。永远。承诺。但是当有人问我时,我可能不得不解释......)。
但是为什么当我使用时它是“宽松”的语义
既然负载是获取而不是释放,为什么这与(1)
and不同(2)
?这里真正放松的是什么?
我唯一能想到的就是我误解了load的意思是acquire。如果这是真的,并且默认值seq_cst
意味着两者,那是否意味着一个完整的围栏 - 没有什么可以传递该指令,也不能传递?我必须误解了那部分。
[并且对称地存储和释放]。
c++ - c++11中的内存建模测试,对memory_order_relaxed感到好奇
我已阅读网页:
http://bartoszmilewski.com/2008/12/01/c-atomics-and-memory-ordering/
然后对在 g++ 4.8.1 编译的测试源进行编码,cpu 是 Intel ...
而且我有时会在同时运行thread1和thread2时得到r1==0 && r2 == 0,我知道这是在存储x(第1行)之前执行的y(第2行)和x(第4行)的负载, store of y(line 3) ....即使像 intel cpu 这样的强内存模型,在 store 之前加载无序仍然会发生,这就是为什么 r1==0 && r2 ==0 在这个测试中仍然发生!!!!
参考 c++11 内存模型,我更改源如下:
这次没有出现 r1==0 && r2 == 0 的结果,我使用的那个 memory_order 是根据我一开始提到的网站,看语句:
memory_order_acquire:保证后续加载不会在当前加载或任何先前加载之前移动。
memory_order_release:前面的存储不会移过当前存储或任何后续存储。
memory_order_acq_rel:结合了前面的两个保证
memory_order_relaxed:所有重新排序都可以。
看起来工作......我仍然做另一个测试,我将代码更改为:
让我感到困惑的是,这个测试仍然没有得到 r1==0 && r2==0 的结果!如果这种情况有效,为什么还要使用 memory_order_acq_rel ?或者这只适用于英特尔CPU?其他类型的 cpu 在 x 和 y 的存储中仍然需要 memory_order_acq_rel 吗?
visual-c++ - 在发布模式下访问 Visual Studio 2012 上的 std::atomic_ullong 对象时访问冲突
这是我的代码(虽然删除了一些不相关的部分):
它在调试模式下编译和运行良好。但是,在我切换到发布模式后,我在运行时不断收到访问冲突异常。如果我将 atomic_ullong 更改为 atomic_ulong 或 atomic_uint,它运行起来没有问题,这太奇怪了。但这两个的长度是不够的。所以有谁知道为什么会发生这种情况以及如何解决它?请帮忙!