- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Dekker 式同步的失败通常用指令的重新排序来解释。即,如果我们写
atomic_int X;
atomic_int Y;
int r1, r2;
static void t1() {
X.store(1, std::memory_order_relaxed)
r1 = Y.load(std::memory_order_relaxed);
}
static void t2() {
Y.store(1, std::memory_order_relaxed)
r2 = X.load(std::memory_order_relaxed);
}
r1==r2==0
.
static void t1() {
X.store(1, std::memory_order_relaxed);
atomic_thread_fence(std::memory_order_acq_rel);
r1 = Y.load(std::memory_order_relaxed);
}
static void t2() {
Y.store(1, std::memory_order_relaxed);
atomic_thread_fence(std::memory_order_acq_rel);
r2 = X.load(std::memory_order_relaxed);
}
r1==r2==0
仍然可以发生。对此是否有基于重新排序的解释?我的推理有什么缺陷?
最佳答案
据我了解(主要来自阅读 Jeff Preshings blog ),一个 atomic_thread_fence(std::memory_order_acq_rel)
防止除 StoreLoad
之外的任何重新排序,即它仍然允许重新排序 Store
带有后续 Load
.但是,这正是您的示例中必须防止的重新排序。
更准确地说,一个 atomic_thread_fence(std::memory_order_acquire)
防止重新排序任何以前的 Load
与任何后续 Store
以及任何后续 Load
,即它阻止了 LoadLoad
和 LoadStore
跨越围栏的重新排序。
安 atomic_thread_fence(std::memory_order_release)
防止重新排序任何后续 Store
前面有任何 Store
和任何之前的 Load
,即它阻止了 LoadStore
和 StoreStore
跨越围栏的重新排序。
安 atomic_thread_fence(std::memory_order_acq_rel)
然后阻止联合,即阻止 LoadLoad
, LoadStore
, 和 StoreStore
,这意味着只有 StoreLoad
可能仍然会发生。
关于multithreading - 为什么 C++11acquire_release 栅栏不足以用于 Dekker 同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27248856/
这真的很烦我,我真的看不出这段代码有什么错误。它应该执行五次 cout #include #include #include #include #include #include usin
我试过修改著名的'Dekker's algorithm ',因此您可以同时将其与三个进程一起使用。这是我的代码: package DekkersAlgorithm; class DekkerAlg {
我正在尝试针对有两条铁路的场景实现 Dekkers 算法,并且有一点它们都使用轨道的同一部分。一次只能允许一列火车进入该路段,并且一列火车可以连续通过任意多次,除非其他列车都已转弯并且它已准备好通过。
这个程序执行两个不同的线程并告诉我谁是“比赛”的赢家。 出乎意料的是,有时两个线程都“获胜”(我希望有人或没有人获胜)。这是预期的行为吗?为什么?我显然在这里遗漏了一些基本的东西。 class Pro
Dekker 算法应该不适用于现代多核处理器,因为它们会重新排序语句以提高性能。不保证顺序代码执行。 如果那是正确的,为什么下面的实现有效? 我在 MacBook Pro 2015 - Capitan
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 8 年前。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。更详细地描述您的问题或inclu
我正在使用 pracma 包,特别是 Brent-Dekker 寻根算法,来搜索一个函数的根,该函数将观测值的变异系数 (CV obs) 设置为等于模拟值 (CV模拟)。 虽然在个人基础上我可以为算法
作为我的任务,我必须验证 Dekker 算法的某些内容 - 但有 3 个进程 - 我只能找到 2 个进程的原始版本。 目标不是算法,而是在 SMV 系统中的实现和验证 http://www.cs.cm
Dekker 式同步的失败通常用指令的重新排序来解释。即,如果我们写 atomic_int X; atomic_int Y; int r1, r2; static void t1() { X.
是的,这是一项家庭作业,但我已经尝试了所有可能的方法,但无法想出一个可能的方案。这个作业的目的是为了说明,在实现dekker算法/peterson算法之前,很可能两个进程不会先后走下去。 impor
我是一名优秀的程序员,十分优秀!