如果我在一个线程上创建一个变量,然后使用ManualResetEvent的WaitOne()方法阻塞,直到另一个线程为同一个变量分配一个值并向EventWaitHandel发送信号。当我在第一个线程上读取变量时,我保证总是得到另一个线程分配的值吗?
(我担心我无法从CPU缓存中获得值,因为据我所知,我还没有使用任何内存屏障)。
例如:
var str = "multi-threading is hard!";
var mre = new ManualResetEvent(false);
Task.Factory.StartNew(() =>
{
str = Console.ReadLine();
mre.Set();
));
mre.WaitOne();
Console.WriteLine(str);发布于 2014-02-21 09:06:37
发布于 2014-02-21 09:03:11
您的变量是一个捕获的变量,即编译器将这个局部变量转换为编译器生成的类的字段,因为您在lambda表达式中使用它。Afaik,这些编译器生成的字段没有标记为volatile,因此可以缓存它们。
编辑:实际上,字段是不稳定的。
您可以通过编写自己的类来防止缓存,这样编译器就不必创建缓存。然而,这当然妨碍了代码的简洁性。
https://stackoverflow.com/questions/21929644
复制相似问题