1

メモリバリアは私にとって新しい概念であるため、理解を深めるために次のテストプログラム (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 が渡された場合でも、それは正しいプログラムですか? メモリバリアが非常に遅いのはなぜですか?

4

1 に答える 1