- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这个程序执行两个不同的线程并告诉我谁是“比赛”的赢家。
出乎意料的是,有时两个线程都“获胜”(我希望有人或没有人获胜)。这是预期的行为吗?为什么?我显然在这里遗漏了一些基本的东西。
class Program
{
public volatile static int a = 0;
public volatile static int b = 0;
public static void Main()
{
for(int i = 0; i < 1000; i++)
{
a = 0;
b = 0;
Parallel.Invoke(delegate { a = 1; if (b == 0) Console.WriteLine("A wins"); },
delegate { b = 1; if (a == 0) Console.WriteLine("B wins"); });
Console.WriteLine(System.Environment.NewLine);
Thread.Sleep(500);
}
}
}
结果:
A wins
B wins
A wins
B wins
A wins
...
最佳答案
您错误地使用了 volatile:
声明变量 volatile 是不够的,您需要确保在任何地方您读/写它们,您使用 Thread.VolatileRead(ref myVar)
/Thread.VolatileWrite(ref myVar)
此外,即使使用正确,volatile 也不确保读/写顺序(来自不同线程)。浏览 SO 以获取有关该主题的信息。 编辑:it seems to do在 x86 单核机器上
您可以简单地使用 lock
声明,但如果你想深究这一点,我建议阅读、理解,然后再阅读 this free e-book
添加:
我刚刚浏览了 Parallel
.NET 4 中的类,没有 volatile
使用关键字。
他们还复制了 Action<T>
的数组在出于某种原因循环之前,但我怀疑这会影响你。
关于c# - Dekker 算法混淆的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12725605/
这真的很烦我,我真的看不出这段代码有什么错误。它应该执行五次 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
我是一名优秀的程序员,十分优秀!