C#信号量检查竞争条件

时间:2014-01-22 17:53:15

标签: c# multithreading race-condition

我正在使用SemaphoreLite来确保将所有触发和错误的事件写入特殊文件。问题是后台线程在写入完成之前调用close,并且由于信号量在一瞬间说它为空,它处理信号量导致写入不完整。

这是我的代码:

    private void waitForWriterErrorEventsToFire()
    {
        //TODO: Figure out a way to avoid race conditions
        if (_notProcessedCount == null)
        {
            return;
        };

        while (_notProcessedCount.CurrentCount != int.MaxValue)
        {
            Thread.Sleep(10);
        }

        Thread.Sleep(500);
        if (_notProcessedCount.CurrentCount != int.MaxValue)
        {
            waitForWriterErrorEventsToFire();
        }
        _notProcessedCount.Dispose();
        _notProcessedCount = null;
    }

Thread.Sleep(500)解决了大部分问题,但这不是正确的做法。我知道竞争条件发生在while循环条件下,Current count返回int.MaxValue,但如果你在sleep之后再次检查它,它现在小于int.MaxValue。关于如何避免竞争条件的任何建议?

我正在考虑编写一些可以检查设定时间的内容,如果条件仍然存在则会在该通过之后进行处理。

0 个答案:

没有答案