相关疑难解决方法(0)

为什么这段代码不能证明读/写的非原子性?

阅读 这个问题,我想测试一下我是否可以证明对这种操作的原子性无法保证的类型的读写非原子性.

private static double _d;

[STAThread]
static void Main()
{
    new Thread(KeepMutating).Start();
    KeepReading();
}

private static void KeepReading()
{
    while (true)
    {
        double dCopy = _d;

        // In release: if (...) throw ...
        Debug.Assert(dCopy == 0D || dCopy == double.MaxValue); // Never fails
    }
}

private static void KeepMutating()
{
    Random rand = new Random();
    while (true)
    {
        _d = rand.Next(2) == 0 ? 0D : double.MaxValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,即使在执行了整整三分钟之后,断言也拒绝失败.是什么赋予了?

  1. 测试不正确.
  2. 测试的具体时序特性使得断言不太可能/不可能失败.
  3. 概率是如此之低,以至于我必须运行测试更长时间以使其可能会触发.
  4. 与C#规范相比,CLR提供了更强的原子性保证.
  5. 我的OS /硬件提供比CLR更强的保证.
  6. 别的什么?

当然,我不打算依赖规范没有明确保证的任何行为,但我想更深入地了解这个问题. …

.net c# double atomic thread-safety

11
推荐指数
1
解决办法
718
查看次数

标签 统计

.net ×1

atomic ×1

c# ×1

double ×1

thread-safety ×1