问题标签 [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.

0 投票
2 回答
10516 浏览

c++ - 获取/释放与顺序一致的内存顺序

对于任何std::atomic<T>T 是原始类型的地方:

如果我盲目地使用std::memory_order_acq_relfor fetch_xxxoperations 和std::memory_order_acquirefor loadoperation 和std::memory_order_releasefor storeoperation (我的意思是就像重置这些函数的默认内存顺序一样)

  • 结果是否与我std::memory_order_seq_cst对任何声明的操作使用(默认使用)相同?
  • 如果结果相同,那么std::memory_order_seq_cst在效率方面,这种用法与使用有何不同?
0 投票
2 回答
143 浏览

multithreading - C++ 中对象的 volatile 关键字

我有一个线程安全的计数器对象(它是一个使用 std::atomic load() 和 store() 的类)作为类成员之一。线程 1 递增计数器,线程 2 读取计数器。

通常,由不同线程共享的原始类型( int 等)被声明为 volatile 以防止任何编译器优化。我是否必须将这个由 2 个不同线程共享的线程安全计数器对象声明为 volatile ?

有人可以对此提供更多见解吗?

0 投票
2 回答
8763 浏览

c++ - c++ 11 std::atomic_flag,我使用正确吗?

我有一个简单的布尔值,需要以线程安全的方式进行测试和设置。如果一个线程已经在工作,我希望第二个线程退出。如果我理解std::atomic_flag正确,这应该可以正常工作。但是,我不确定我理解std::atomic_flag正确:) 我似乎无法在网上找到很多简单的示例,除了这个自旋锁示例:

更新:根据以下建议更新了代码,形成了正确使用std::atomic_flag. 谢谢大家!

0 投票
1 回答
12039 浏览

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 ?我错过了什么?

0 投票
6 回答
79326 浏览

c++ - 我什么时候真的需要使用原子而不是布尔?

因为本质上是原子的,所以不是atomic<bool>多余的吗?bool我认为不可能有部分修改的 bool 值。我什么时候真的需要使用atomic<bool>而不是bool

0 投票
1 回答
720 浏览

c++ - 如果您必须检查溢出或有条件地采取行动,std::atomic 是多余的吗?

例如,您可以安全地递增和递减 std::atomic_int。但是,如果您需要检查溢出或根据值有条件地执行一些例程,那么无论如何都需要锁定。由于您必须比较该值,并且线程可能在比较成功后立即被交换,另一个线程修改,......错误。

但是如果你需要一个锁,那么你可以只使用一个普通的整数而不是原子的。我对吗?

0 投票
2 回答
26080 浏览

c++ - 是否 std::atomic适当地工作?

我正在阅读 Anthony Williams 的“C++ Concurrency in Action”和第 5 章,其中讨论了新的多线程感知内存模型和原子操作,他说:

为了std::atomic<UDT>用于一些用户定义的UDT,这个类型必须有一个普通的复制赋值操作符。

据我了解,这意味着std::atomic<UDT>如果以下返回 true,我们可以使用:

按照这种逻辑,我们不应该将其std::string用作模板参数std::atomic并使其正常工作。

但是,以下代码编译并运行并显示预期输出:

这是一种未定义行为的情况,只是恰好按预期运行吗?

提前致谢!

0 投票
3 回答
1781 浏览

c++ - 放松的原子规则有什么(轻微的)区别?

在看到 Herb Sutters关于“原子武器”的精彩演讲后,我对“轻松原子”示例感到有些困惑。

我认为C++ 内存模型中的原子(SC-DRF = Sequentially Consistent for Data Race Free)在加载/读取时执行“获取”。

我知道对于负载 [和商店],默认值是std::memory_order_seq_cst,因此两者是相同的:

到目前为止一切顺利,没有涉及轻松原子(在听完演讲后,我永远不会使用轻松的原子。永远。承诺。但是当有人问我时,我可能不得不解释......)。

但是为什么当我使用时它是“宽松”的语义

既然负载获取不是释放,为什么这与(1)and不同(2)这里真正放松的是什么?

我唯一能想到的就是我误解了load的意思是acquire。如果这是真的,并且默认值seq_cst意味着两者,那是否意味着一个完整的围栏 - 没有什么可以传递该指令,也不能传递?我必须误解了那部分。

[并且对称地存储释放]。

0 投票
2 回答
271 浏览

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 吗?

0 投票
1 回答
746 浏览

visual-c++ - 在发布模式下访问 Visual Studio 2012 上的 std::atomic_ullong 对象时访问冲突

这是我的代码(虽然删除了一些不相关的部分):

它在调试模式下编译和运行良好。但是,在我切换到发布模式后,我在运行时不断收到访问冲突异常。如果我将 atomic_ullong 更改为 atomic_ulong 或 atomic_uint,它运行起来没有问题,这太奇怪了。但这两个的长度是不够的。所以有谁知道为什么会发生这种情况以及如何解决它?请帮忙!