问题标签 [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++ - 可以通过 C++11 中的后续顺序一致加载重新排序存储发布吗?
带有std::memory_order_release
to 某个位置的商店可以重新排序,随后从另一个位置加载std::memory_order_acquire
.
但是,具有某个位置的商店std::memory_order_release
是否可以在随后从另一个位置加载时重新排序std::memory_order_seq_cst
?
类似地,一个存储std::memory_order_seq_cst
到一个变量的存储是否可以在随后从另一个位置加载时重新排序std::memory_order_acquire
?
考虑这个例子:
众所周知(http://bartoszmilewski.com/2008/11/05/who-ordered-memory-fences-on-an-x86/)如果两者std::memory_order_seq_cst
都被它们的释放/获取对应物替换,输出可能是两个乘以“0”。
在这个例子中,顺序一致性是否可以购买任何东西,或者输出仍然可以是“0”的两倍?
c++ - std::mutex 和 std::atomic 的链接问题
我有这个:
单例.h
单例.cpp
主文件
当我尝试构建时,我得到了这个错误(Visual Studios):
错误 1 错误 LNK2001:无法解析的外部符号“public: static struct std::atomic Singleton::m_instance”(?m_instance@Singleton@@2U?$atomic@PAVSingleton@@@std@@A) c:...Singleton。对象单例
和:
错误 2 错误 LNK2001: 无法解析的外部符号“public: static class std::mutex Singleton::m_mutex” (?m_mutex@Singleton@@2Vmutex@std@@A) c:\Users\InusualZ\documents\visual ...Singleton .obj 单例
c++ - Accessing uninitialized atomic private variable in c++
Supposed I have the following class:
Assume that I initialize all the other variables in the class, except n_
and that this is not thread local storage, so there is no zero initialization.
I create an object of class A, and keep calling incrementN()
.
If at some point I want the value of n_
, and I call getN()
, can this cause the load()
routine for the atomic n_
to crash?
c++ - std::atomic_int 出现“使用已删除函数”错误
我想使用一个std::atomic_int
变量。在我的代码中,我有:
这给了我一个编译错误:
知道发生了什么吗?
c++ - 其他线程是否总是以相同的顺序看到不同线程中对同一位置的两次轻松写入?
在 x86 架构上,存储到同一内存位置具有总顺序,例如,请参阅此视频。C++11 内存模型中的保证是什么?
更准确地说,在
是否r1==1, r2==2, r3==2, r4==1
允许结果(在 x86 以外的某些架构上)?如果我将 all 替换memory_order
为std::memory_order_relaxed
怎么办?
c++ - 编译时内存重新排序会导致死锁吗?
在观看有关 LLVM 中 C++11 原子实现的讨论时,有这段代码
我认为这段代码没有数据竞争(正如演讲者所说):它永远不会打印除42
.
但是,我不确定它是否会打印42
. 我的问题是:是否允许编译器在线程 1 中的 while 循环之后重新排序存储,以便两个线程都死锁?或者 C++11 标准的哪一部分阻止了这种行为?
c++ - 修改前排序一致性
放宽排序 标记为 std::memory_order_relaxed 的原子操作不是同步操作,它们不对内存进行排序。它们只保证原子性和修改顺序的一致性。例如,x 和 y 最初为零,
允许产生 r1 == r2 == 42,因为尽管 A 在 B 之前排序并且 C 在 D 之前排序,但没有什么可以阻止 D 在 y 的修改顺序中出现在 A 之前,并且 B 在修改中出现在 C 之前x 的顺序。
问题:是什么赋予上述代码属性A 在 B 之前排序而C 在 D 之前排序?
编辑:
导致
在带有 -02 选项的 GCC 4.6.1 下
所以我们清楚地看到(A)和(B)已经切换了
c++ - 原子比较并有条件地减去如果小于
我管理一些并发线程使用的内存,并且我有一个变量
无符号整数 freeBytes
当我从任务中请求一些内存时
无符号整数字节需要
我必须检查是否
bytesNeeded<=freeBytes
如果是,则保留 freeBytes 的旧值并从 freeBytes bytesNeeded 中原子地减去。
原子库或 x86 是否提供这种可能性?
c++ - 对不同线程中不同位置的两次原子写入是否总是以相同的顺序被其他线程看到?
与我之前的问题类似,请考虑此代码
在这种情况下,在 C++11 内存模型下会出现奇怪的结果 吗?如果我要替换 all怎么办?r1==1, r2==0
r3==2, r4==0
std::memory_order_acq_rel
std::memory_order_relaxed
在 x86 上,这样的结果似乎是被禁止的,请参阅这个 SO question,但我一般是在询问 C++11 内存模型。
奖金问题:
我们都同意,std::memory_order_seq_cst
奇怪的结果在 C++11 中是不允许的。现在,Herb Sutter 在他著名的atomic<>
-weapons talk @ 42:30 中说,std::memory_order_seq_cst
这就像std::memory_order_acq_rel
-loads std::memory_order_acquire
可能不会在std::memory_order_release
-writes 之前移动。我看不出上面示例中的这个附加约束如何防止奇怪的结果。谁能解释一下?
c++ - x86 宽松的排序性能?
由于英特尔提供强大的硬件内存模型,在 C++11 程序中使用“memory_order_relaxed”有什么优势吗?或者只是将其保留为默认的“顺序一致”,因为它没有区别?