【发布时间】:2013-06-06 13:38:45
【问题描述】:
由于内存屏障对我来说是一个新概念,所以我试图理解它们,所以我编写了以下测试程序 (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,它仍然是一个正确的程序吗? 为什么内存屏障这么慢?
【问题讨论】:
标签: c# .net memory-barriers