gpt4 book ai didi

c# - 通知编译器变量可能从另一个线程更新

转载 作者:太空宇宙 更新时间:2023-11-03 15:28:16 26 4
gpt4 key购买 nike

这通常使用 volatile 来完成。但在 longdouble 的情况下,这是不可能的。

也许只是让它成为 public 就足够了,然后编译器知道它可以被另一个程序集使用并且不会“优化它”?这可以依靠吗?其他方式?

需要说明的是,我并不担心变量的并发读/写。只有一件事 - 它没有得到优化。 (就像在 https://stackoverflow.com/a/1284007/939213 中一样。)

最佳答案

防止代码删除的最佳方法是使用代码。

如果您担心优化示例中的 while 循环

class Test  
{
long foo;

static void Main()
{
var test = new Test();

new Thread(delegate() { Thread.Sleep(500); test.foo = 255; }).Start();

while (test.foo != 255) ;
Console.WriteLine("OK");
}
}

你仍然可以通过修改你的 while 循环来使用 volatile 来做到这一点

volatile int temp;

//code skipped in this sample
while(test.foo != 255) { temp = (int)foo;}

现在假设您确定不会有任何线程安全问题。你正在使用你的 long foo 所以它不会被优化掉。并且您不在乎失去您长的任何部分,因为您只是想让它保持活力。

如果您这样做,请务必将您的代码标记得非常清楚。可能写一个 VolatileLong 类来包装你的 long(和你的 volatile int),这样其他人就能理解你在做什么

其他线程安全工具(如锁)也可以防止代码删除。例如,编译器足够聪明,不会在像这样的单例模式中删除 double 。

if (_instance == null) {
lock(_lock) {
if (_instance == null) {
_instance = new Singleton();
}
}
}
return _instance;

关于c# - 通知编译器变量可能从另一个线程更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34484583/

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