我正在编写通常的 reader-writer 功能,其中一个主线程相等,而多个线程出队。因此,在代码的一部分中,我将ConcurrentQueue
中的项目计数与某个整数进行比较,我们将其称为“ maxSize”。尽管.Count
返回 1 并且 maxSize 为10,但queue.Count >= maxSize
返回true。
我试图用断点进行调试,仅设置一个出队线程,甚至暂停它。在主线程排入队列之后,在几行代码之后,这种比较立即返回了1> = 10的结果。
我确定此时主线程仅放入1个项目,我确定没有调用Dequeue()
。另外,我尝试仔细检查锁定,但有时无济于事。
我想知道是否有某些 magic 不允许我以某种方式正确比较值,因为当我在调试器中看到1> = 10为真时,撕裂了。
int maxSize = 10;
Timer timer;
ctor(int interval)
{
queue = new ConcurrentQueue<HttpSessionState>();
timer = new Timer(TimeSpan.FromSeconds(interval).TotalMilliseconds);
timer.Elapsed += (sender, args) => PulseIfAvailableForProcessing(true);
}
void Process()
{
queue.Enqueue(obj);
// interval here is huge, several minutes
timer.Start();
PulseIfAvailableForProcessing(false);
}
bool PulseIfAvailableForProcessing(bool isTimeout)
{
if (isTimeout)
{
...
}
else
{
// here 1 >= 10 gives true
if (queue.Count >= maxSize)
{
lock (_dataLock)
{
// here in debug queue.Count is still 1, however 1 >= 10 returns false
if (queue.Count >= maxSize)
{
Pulse();
}
}
}
}
}
在绝望中,我添加了日志记录,我发现在单元测试期间,即使在lock语句内部,该问题也可以重现。