System.Threading.Timer使用的变量是否需要缓存?

时间:2016-12-23 04:58:02

标签: c# multithreading volatile interlocked memory-fences

我正在尝试对一个神秘停止的进程进行故障排除,并且我试图确定我们是否可能遇到缓存变量并且永远不会再次读取的变量。

在我的场景中,我有一个在定时器上发生的操作(我将调用Poll)和一对外部函数被调用以指示外部操作的开始和停止。由于细节不值得进入,这个假设类不希望在外部操作发生时执行Poll操作。此外,外部操作可能同时发生多次,因此我使用计数器来指示正在进行的操作的数量。

当前的逻辑看起来或多或少像这个简化的例子:

class MyClass
{
    private int operationsInProgress;

    private void Poll() // Pretend we have a timer in place that's calling this periodically
    {
        var inProgress = operationsInProgress;

        if (inProgress > 0) return;

        DoSomething();
    }

    public void StartExternalOperation()
    {
        Interlocked.Increment(ref operationsInProgress);
    }

    public void EndExternalOperation()
    {
        Interlocked.Decrement(ref operationsInProgress);
    }
}

假设:

  • StartExternalOperationEndExternalOperation被调用的次数相同 - 它们在try...finally内执行,并且没有留下孤立{{1}的路径坐在那里
  • 在不确定的执行次数之后的某个时刻,Start永远不会被再次召唤。在我的真实场景中,我不知道完全为什么,但我已经消除了除此之外我能找到的所有其他原因。

是否可能因为我没有在读取操作中使用任何类型的栅栏(通过DoSomething()Interlocked变量),该值将被缓存并且实际变量isn& #39;再次阅读?

由于这是一个我们无法可靠再现的问题,我需要知道我怀疑的是否可能是合理的原因。我可以更改代码以使用更像volatile(或ReaderWriterLock)的更正式的东西,我知道我会有正确的逻辑,我只需要知道我所描述的是否可以合法地事业。

0 个答案:

没有答案