加入线程时是否需要内存屏障?

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)

是否需要上述代码段中的两个(或更多)障碍?

Nil*_*ose 0

从文档来看,它们似乎不是必需的 -

仅在内存排序较弱的多处理器系统(例如,采用多个 Intel Itanium 处理器的系统)上才需要 MemoryBarrier。

对于大多数用途,C# lock 语句、Visual Basic SyncLock 语句或 Monitor 类提供了更简单的数据同步方法。

当您通过 join 进行阻止时,就更没有必要了。