Ani*_*Ani 5 .net c# multithreading thread-safety memory-barriers
如果一个线程A生成另一个线程B,其唯一目的是写入变量V然后等待它终止,那么是否需要内存屏障以确保线程A上的后续V读取是新鲜的?我不确定终止/加入操作中是否有任何隐含的障碍使它们变得多余.
这是一个例子:
public static T ExecuteWithCustomStackSize<T>
(Func<T> func, int stackSize)
{
T result = default(T);
var thread = new Thread(
() =>
{
result = func();
Thread.MemoryBarrier(); // Required?
}
, stackSize);
thread.Start();
thread.Join();
Thread.MemoryBarrier(); // Required?
return result;
}
Run Code Online (Sandbox Code Playgroud)
是否需要上述代码段中的两个(或更多)障碍?
从文档来看,它们似乎不是必需的 -
仅在内存排序较弱的多处理器系统(例如,采用多个 Intel Itanium 处理器的系统)上才需要 MemoryBarrier。
对于大多数用途,C# lock 语句、Visual Basic SyncLock 语句或 Monitor 类提供了更简单的数据同步方法。
当您通过 join 进行阻止时,就更没有必要了。