问题标签 [memory-model]
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.
java - 什么是“顺序一致的执行没有数据竞争”?
在JLS 中,第 17.4.5 节。Happens-before Order,它说
当且仅当所有顺序一致的执行都没有数据竞争时,程序才能正确同步。
它只给我们关于“顺序一致”的定义,它没有给我们关于“顺序一致执行”的定义。只有在知道什么是“顺序一致的执行”之后,我们才能进一步讨论这个话题。
那么什么是“顺序一致的执行”以及什么是“顺序一致的执行没有数据竞争”?
java - Java 内存模型中具有数据竞争的正确同步程序示例
在JLS 中,第 17.4.5 节。Happens-before Order,它说
当且仅当所有顺序一致的执行都没有数据竞争时,程序才能正确同步。
根据是否正确同步的程序仍然允许数据竞争?(第一部分)中的讨论,我们得到以下结论:
程序可以正确同步并具有数据竞争。
两个结论的结合意味着它必须存在这样一个例子:
程序的所有顺序一致执行都是无数据竞争的,但此类程序的正常执行(除顺序一致执行之外的执行)包含数据竞争。
经过深思熟虑,我仍然找不到这样的代码示例。那你呢?
java - 正确的程序可能会错误地同步吗?
在回答正确同步的程序是否仍然允许数据竞争?(第一部分)时,它给了我们一个很好的例子:一个程序的所有执行似乎都是顺序一致的,但它仍然存在数据竞争。它告诉我们为什么JLS中以下结论的另一个方向是不正确的:
如果一个程序没有数据竞争,那么程序的所有执行都将看起来是顺序一致的。
现在看看JLS中的另一个结论:
当且仅当所有顺序一致的执行都没有数据竞争时,程序才能正确同步。
根据这个结论,上面的例子没有正确同步,那么一个正确的程序会不会被错误地同步呢?
java - 为什么我们不能应用 JLS 中包含的保证?
我从邮件列表中收到一封邮件,其中说如果对 volatile vars 的操作包含数据竞争,那么保证(“当且仅当所有顺序一致的执行都没有数据竞争时,程序才能正确同步。”在JLS中)不能应用。
为方便起见,我只是将部分原始内容放在这里:
我有一个使用 volatile 变量的程序,我试图使用“当且仅当所有顺序一致的执行都没有数据竞争时,程序才能正确同步”来推断它。JLS3 中的保证。
JLS3 似乎包含一个故障,使我无法证明我的程序没有数据竞争。具体来说,考虑对 volatile 变量 V 的读取 R 和在同步顺序中 R 之后的 V 的写入 W。JLS3 似乎认为 R 和 W 是冲突的访问。此外,从 R 到 W 没有发生之前的边缘(这是正确的)。因此,JLS3 似乎也认为 R 和 W 构成了数据竞赛。最后,因此我似乎无法应用上述保证。
所以这是我的问题:如果对 volatile vars 的操作包含数据竞争,为什么我们不能应用 JLS 中包含的保证?
java - A reordering which may never happen
In discussion at Does a correctly synchronized program still allow data race?(Part I), we got two very good examples.
I just want to discuss the second one. For convenience, I just put second example at here:
According to fist item in definition of happens-before relationship: If x and y are actions of the same thread and x comes before y in program order, then hb(x, y), we may get following conclusion:
there are hb((1),(2)) and hb((2),(3)), hence hb((1),(3)).
Because:
hash is a shared variable;
(1),(2),(3) are all actions of the same thread;
(1) comes before (2), (2) comes before (3) in program order.
Now back to my question: if there is a happens-before relationship between (1) and (3), then (1) and (3) should never be reordered.
Is there any misunderstanding in my explanation? How about your opinion?
c++ - 关于 C++11 内存模型的奇怪结果(松弛排序)
我在 Anthony Williams 的书“C++ Concurrency”的内存模型中测试了这个例子
根据解释,对差异变量(此处为 x 和 y)的宽松操作可以自由地重新排序。但是,我重复运行了几天以上的问题。我从来没有遇到过断言 (assert(z.load()!=0);) 触发的情况。我只是使用默认优化并使用 g++ -std=c++11 -lpthread dataRaceAtomic.cpp 编译代码有人真的尝试过并点击断言吗?谁能给我解释一下我的测试结果?顺便说一句,我也尝试了不使用原子类型的版本,我得到了相同的结果。目前,这两个程序运行良好。谢谢。
c++ - memory_order_seq_cst 和 memory_order_acq_rel 有何不同?
存储是释放操作,加载是两者的获取操作。我知道这memory_order_seq_cst
意味着对所有操作施加额外的总排序,但我无法构建一个示例,如果所有memory_order_seq_cst
操作都替换为memory_order_acq_rel
.
我是否遗漏了什么,或者差异只是文档效果,即memory_order_seq_cst
如果一个人不打算使用更宽松的模型并memory_order_acq_rel
在约束宽松模型时使用,则应该使用?
c++ - 每个 memory_order 是什么意思?
我读了一章,我不太喜欢它。我仍然不清楚每个内存顺序之间有什么区别。这是我目前的猜测,在阅读了更简单的http://en.cppreference.com/w/cpp/atomic/memory_order后我理解了
以下是错误的,所以不要试图从中学习
- memory_order_relaxed:不同步,但在不同原子变量中从另一个模式完成订单时不会被忽略
- memory_order_consume:同步读取这个原子变量,但是它不同步在此之前编写的宽松变量。但是,如果线程在修改 Y(并释放它)时使用 var X。其他消耗 Y 的线程也会看到 X 被释放?我不知道这是否意味着这个线程推出了 x(显然是 y)的变化
- memory_order_acquire:同步读取这个原子变量,并确保在此之前写入的宽松变量也被同步。(这是否意味着所有线程上的所有原子变量都已同步?)
- memory_order_release:将原子存储推送到其他线程(但前提是它们使用消耗/获取读取 var)
- memory_order_acq_rel:用于读/写操作。是否进行获取,以便您不修改旧值并释放更改。
- memory_order_seq_cst:与获取释放相同,除了它强制在其他线程中看到更新(如果
a
在另一个线程上放松存储。我b
用 seq_cst 存储。a
用放松读取的第三个线程会看到变化以及b
任何其他原子变量? )。
我想我理解但如果我错了请纠正我。我找不到任何用易于阅读的英语解释它的东西。
c++ - 非平凡可复制类型的值表示
我对标准中的以下段落(ISO/IEC 14882:2011(E)的§3.9/4)很感兴趣:
类型对象的对象表示是类型对象占用的N
T
个对象的序列,其中N等于。对象的值表示是保存 type 值的一组位。对于普通可复制类型,值表示是对象表示中确定值的一组位,该值是实现定义的一组值的一个离散元素。42unsigned char
T
sizeof(T)
T
我了解对象表示和值表示是不同的,以允许某些对象表示不参与对象的值(例如,填充)。不过,我不太明白可复制的类型。非平凡可复制类型没有值吗?非平凡可复制类型的部分值表示是否可以存在于其对象表示之外?
注释 42 解释:
目的是 C++ 的内存模型与 ISO/IEC 9899 编程语言 C 的内存模型兼容。
我仍然不明白为什么前面的语句只专门用于可复制的类型。这有什么意义?
c++ - C11/C++11 内存模型
我有两个问题:
我想知道 C++11 和 C11 的标准是否会共享相同的内存模型规范。我读到是这样,事实上 C11 正在“继承”C++11 内存模型(无论出于何种历史原因,后者要么首先发生,要么同时发生/与同一个人发生,尽管我认为 Boehm,他是主要是 C++ 的家伙,有很多话要说。),但我想确保问一个更有知识的人。
我的下一个问题是:GCC 会实现这个内存模型吗?我还没有看到这方面的路线图,并且想知道是否有人有“独家新闻”。