在线程之间共享局部变量是否安全(通过回调闭包)?

Sha*_*ane 12 .net c# concurrency multithreading

我想做类似下面的事情 - 基本上我调用异步操作,它将在另一个线程中调用回调,我想等待它完成"内联".我担心的是,由于存储在寄存器中,因此跨线程共享的变量变量(bar和event)可能无法同步.如果它们是成员变量,我可以将它们标记为volatile,但volatile不能用于堆栈上创建的局部变量.我可以使用成员变量,但我认为它更干净,不会让我的课程整洁.

Bar bar = null;
ManualResetEvent event = new ManualResetEvent(false);

foo.AsyncOperation(new Action(()=>{    
    // This delegate will be called in another thread
    bar = ...
    event.Set();
}));

event.WaitOne(timeout);
// use bar
Run Code Online (Sandbox Code Playgroud)

xan*_*tos 6

是的,它会正常工作.在这里阅读

http://www.albahari.com/threading/part4.aspx

The following implicitly generate full fences: Setting and waiting on a signaling construct

并且在信号构建ManualResetEvent中包括.

如果你想知道什么full fence是,在同一页面:

完全围栏最简单的内存屏障是一个完整的内存屏障(全栅栏),可以防止任何类型的指令重新排序或围绕该围栏缓存.调用Thread.MemoryBarrier会生成一个完整的栅栏;

  • @Marc关于线程安全和防护的msdn文档非常缺乏,如果我没记错的话,但是http://msdn.microsoft.com/en-us/library/ms686355(v=vs.85).aspx`以下同步函数使用适当的障碍来确保内存排序:``等待函数`和`用于指示同步对象的函数` (2认同)