gpt4 book ai didi

c# - 在标志字段上使用 volatile 关键字

转载 作者:行者123 更新时间:2023-11-30 21:37:21 29 4
gpt4 key购买 nike

我试图理解 volatile 在多线程上下文中的使用。在以下代码中来自 another source of knowledge在互联网上:

class Program
{
static string _result;
//static volatile bool _done;
static bool _done;

static void SetVolatile()
{
// Set the string.
_result = "Dot Net Perls";
// The volatile field must be set at the end of this method.
_done = true;
}

static void Main()
{
// Run the above method on a new thread.
new Thread(new ThreadStart(SetVolatile)).Start();

// Wait a while.
Thread.Sleep(200);

// Read the volatile field.
if (_done)
{
Console.WriteLine(_result);
}
}
}

volatile 关键字的演示使用应防止线程读取存储在缓存中的值。它应该检查一个实际值,而不是这个。

所以如果没有 volatile _done 应该仍然有一个 false 值(从缓存中读取)并且 Console.WriteLine 语句不应该被执行。

不幸的是,在没有 volatile 关键字的调试/ Release模式下运行此代码总是会产生输出。这个特定示例的意义何在?

最佳答案

如前所述,不使用 volatile 关键字并不意味着在所有情况下都需要缓存所有读取。它们可能被缓存,也可能没有。但是如果你想要更多可重现的例子,试试这个:

class Program {
static string _result;
//static volatile bool _done;
static bool _done;
static void SetVolatile() {
// Set the string.
_result = "Dot Net Perls";
// The volatile field must be set at the end of this method.
_done = true;
}

static void Main() {
// Run the above method on a new thread.
new Thread(new ThreadStart(SetVolatile)).Start();

// prevent compiler to throw away empty while loop
// by doing something in it
int i = 0;
while (!_done) {
i++;
}
Console.WriteLine("done " + i);
}
}

在这里,您在 while 循环中重复读取 _done,增加了它被缓存的可能性。程序应该以“完成”消息终止,但不会,因为不会注意到从另一个线程更改为 _done

关于c# - 在标志字段上使用 volatile 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47309012/

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