gpt4 book ai didi

c# - Dekker 算法混淆的变体

转载 作者:太空狗 更新时间:2023-10-29 20:31:16 28 4
gpt4 key购买 nike

这个程序执行两个不同的线程并告诉我谁是“比赛”的赢家。

出乎意料的是,有时两个线程都“获胜”(我希望有人或没有人获胜)。这是预期的行为吗?为什么?我显然在这里遗漏了一些基本的东西。

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com