use*_*740 3 .net c# multithreading thread-safety
鉴于代码:
object sync = new object();
string result = null;
var thread = new Thread(() => {
var workResult = DoSomeWork();
lock (sync) { result = workResult; }
});
thread.Start();
thread.Join();
lock (sync) {
// No code in here - not 'atomic' wrt the thread
// as the thread has been terminated and joined.
}
// Is it SAFE to access the `result` here?
UseResultFromThread(result);
Run Code Online (Sandbox Code Playgroud)
对于从线程内设置的值的线程可见性,空 是否lock确保发生result?
如果不是(即使是这样),lock在给定先前建立的线程寿命排序的情况下,是否有比使用此方法更好的方法?
或者(和Y问题)Join足以让修改后的变量的线程可见性?
它会起作用,是的,因为进入锁定涉及内存屏障.你可以使用Thread.MemoryBarrier而不是仅仅做到这一点.性能几乎相同,主要是为了改善读者的语义.
也就是说,如果您使用任务代替整个事情变得容易多了,因为它们专门用于表示具有结果的操作,并且在访问该结果时它们将负责相应的同步.您的代码可以简单地编写:
var result = Task.Run(() => DoSomeWork()).Result;
UseResultFromThread(result);
Run Code Online (Sandbox Code Playgroud)
当然,如果您只是等待它完成,那么创建一个新线程来完成某些工作并没有多大意义.那时你也可以让原始线程完成工作,而不是先打扰第二个线程; 这大大简化了整个事情:
UseResultFromThread(DoSomeWOrk());
Run Code Online (Sandbox Code Playgroud)
并做了.
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |