有没有一种方法可以查询一个临界区有多少个块?

3

我有一个使用TCriticalSection的多线程Delphi应用程序。 有时线程计数开始变得非常高。 大约30秒后,所有线程最终都会处理完毕。 我怀疑我的Critial Section封装代码有时需要比平常更长的时间来处理。 因此,对所有其他线程产生“阻塞”。

是否有一种方法可以查询CritialSections并找出它们当前阻止了多少个线程?

try
  ReportCriticalSection.Acquire;
  ........
finally
  ReportCriticalSection.Release;
end;

3
问题中的代码是错误的。try语句放置的位置不正确。应该在获取资源后立即放置。 - David Heffernan
你可以随时暂停调试器并查看线程的调用堆栈... - J...
1个回答

4

请检查TRtlCriticalSection.LockCount字段。在TCriticalSection中,RTL结构是受保护的字段。

Matt Pietrek和Russ Osterlund几年前在MSDN Magazine上发表了一篇文章,其中包括对所有字段含义的描述。仅用于调试,不用于业务逻辑。

在Windows下打破临界区中的代码死锁


谢谢。我能够找到计数。这帮助我解决了服务中的重大问题。问题:将LockCount保护起来的目的是什么?为什么不直接公开它,以便人们可以在不从TCriticalSection派生的情况下访问它? - M Schenkel
1
并不是LockCount受到保护,整个TRtlCriticalSection记录都受到保护。这是TCriticalSection Windows版本的实现细节。即使是LockCount本身通常也是实现细节;我认为MSDN没有对其进行文档化。 - Rob Kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接