由于内存屏障对我来说是一个新概念,我试图了解它们,所以我编写了以下测试程序(C#):
private static void Func1()
{
SpinLock sl = new SpinLock();
Action action = () =>
{
for (int i = 0; i < 100; i++)
{
bool lockTaken = false;
sl.Enter(ref lockTaken);
if (lockTaken)
sl.Exit(true);
}
};
Parallel.Invoke(action, action);
}
private static void Main(string[] arg)
{
for (int i = 0; i < 10000; i++)
Func1();
}
问题是关于 Spinlock.Exit(true) 函数。true 表示发出内存屏障以立即将退出操作发布到其他线程。
当传递 false 时,不会发出内存屏障,然后代码运行速度几乎是两倍。
如果操作对象将包含线程之间的共享内存并且传递 false,它仍然是一个正确的程序吗?为什么内存屏障这么慢?