メモリバリアは私にとって新しい概念であるため、理解を深めるために次のテストプログラム (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 を渡すと、メモリ バリアは発行されず、コードはほぼ 2 倍の速さで実行されます。
アクション オブジェクトがスレッド間の共有メモリを含み、false が渡された場合でも、それは正しいプログラムですか? メモリバリアが非常に遅いのはなぜですか?