是否可以创建一个测试,显示C#中双重检查锁定的失败?

Rob*_*don 7 c# multithreading locking

所以这是我的双重检查锁定的自定义实用程序:它是一个静态方法,您可以在其中提供标准,同步对象和要执行的操作.

public static bool RunIf(Func<bool> criterion, object syncObject, Action action)
{
    if (criterion())
        lock(syncObject)
            if (criterion())
            {
                Thread.MemoryBarrier(); 
                action();
                return true;
            }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我了解到,根据C#规范,优化器可以以这样的方式重新排序内存分配:在没有内存障碍的情况下,这种技术可以给出误报并在不应该执行时执行操作.

在我的小世界中,如果这种失败是可能的,那么还应该可以设计一个测试,通过足够多的并行测试用例来充分地使用场景来证明失败.我一直在寻找这样的测试大约一年,但到目前为止,我已经画了一个空白.谁能告诉我一个测试:

  1. 表明在没有记忆障碍的情况下该方法的失败;

  2. 当内存屏障恢复重复测试时,它显示了它的成功吗?

Ben*_*igt 1

不,不可能测试非确定性行为(或者至少,如果这样做,则负面结果仍然不确定)。