gpt4 book ai didi

c# - 代码示例被证明在没有 volatile 的情况下会失败

转载 作者:行者123 更新时间:2023-12-02 15:29:26 25 4
gpt4 key购买 nike

下面是一个 C# 代码示例,它是对损坏的 Java 代码的逐字翻译(已证明该代码会损坏(即第二个线程可能无法观察到 sharedValue 值的变化),至少在Mac OS X 10.9、Java 1.8(64 位)、Arrandale(1 插槽 x 2 核心 x 2 HT = 4 个硬件线程):

using System;
using System.Threading;

class ThreadTest {
/* volatile */ private int sharedValue;

private void RunAsync() {
while (this.sharedValue == 0);
}

private bool Test() {
Thread t = new Thread(this.RunAsync);
t.IsBackground = true;
t.Start();

Thread.Sleep(10);

// Yes I'm aware the operation is not atomic
this.sharedValue++;

t.Join(10);
bool success = !t.IsAlive;
if (!success) {
Console.Write('.');
}
return success;
}

static void Main() {
long failureCount = 0L;
const long testCount = 10000L;
for (long i = 0; i < testCount; i++) {
if (!new ThreadTest().Test()) {
failureCount++;
}
}
Console.WriteLine();
Console.WriteLine("Failure rate: " + 100.0 * failureCount / testCount + "%");
}
}

令人惊讶的是,无论我在 .NET 4.0/Windows XP(32 位)上运行上述 C# 代码多少次,我都没有观察到任何失败。在 Mono(64 位)、Mac OS X 上运行时也没有出现任何故障。在这两种情况下,我只看到一个 CPU 核心繁忙。

您能否建议一个 C# 代码示例,该示例错误地使用了共享变量,并且除非将该变量标记为 volatile ,否则会失败?

最佳答案

尝试运行以下程序的发布版本(不要从调试器运行它,否则演示将无法工作 - 因此通过“调试 | 启动而不调试”运行发布版本):

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Demo
{
internal class Program
{
private void run()
{
Task.Factory.StartNew(resetFlagAfter1s);
int x = 0;

while (flag)
++x;

Console.WriteLine("Done");
}

private void resetFlagAfter1s()
{
Thread.Sleep(1000);
flag = false;
}

private volatile bool flag = true;

private static void Main()
{
new Program().run();
}
}
}

程序将在一秒钟后终止。

现在从该行中删除 volatile

private volatile bool flag = true; // <--- Remove volatile from this

这样做之后,程序将永远不会终止。 (在 Windows 8 x64、.Net 4.5 上测试)

但请注意,在某些情况下,使用 Thread.MemoryBarrier() 比声明变量 volatile 更合适,即:

while (flag)
{
Thread.MemoryBarrier();
++x;
}

有关详细信息,请参阅http://blogs.msdn.com/b/brada/archive/2004/05/12/130935.aspx

关于c# - 代码示例被证明在没有 volatile 的情况下会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24556043/

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