如何为C#lock函数添加诊断以进行多线程调试

时间:2015-05-29 08:53:40

标签: c# multithreading locking mutex

是否可以填充C#锁定功能,添加诊断信息? 我希望看到锁被占用或释放,锁定计数以及获取锁定的线程的托管线程ID。

在C ++中,您编写自己的Mutex类并提供自己的锁定功能,并且您可以自己添加这些类型的诊断。

是否可以包装锁定功能或填充功能以提供诊断功能?

提前感谢您的任何帮助。

1 个答案:

答案 0 :(得分:1)

您无法对lock语句进行填充,但您当然可以实现自己的锁定类Monitor类(基于lock)。

C#规范8.12说lock语句“完全等同于”:

bool __lockWasTaken = false;
try {
    System.Threading.Monitor.Enter(x, ref __lockWasTaken);
    ...
}
finally {
    if (__lockWasTaken) System.Threading.Monitor.Exit(x);
}

所以没有办法“挂钩”。我想知道,如果你定义自己的方法System.Threading.Monitor.Enter会发生什么......你永远不会让编译器使用它,因为它是一个模糊的名字。但规范并未说明当时会发生什么。

您可以安装自定义CLR主机或分析器,并使用本机API来填充锁。不过,这是一个核选择。