C#:如何检测方法是从临界区还是外部调用?
同步问题调试守卫方案
前置条件
我需要在大型遗留“意大利面”代码库中修复同步问题。部分类必须进行同步,但这些类的调用场景繁多,因此我希望通过调试守卫来捕获问题。以下是一种用于报告类调用问题的思路:
调试用类
public class AsyncChecker { private readonly Thread myThread; private volatile bool myTurnedOn; public AsyncChecker() { myThread = Thread.CurrentThread; myTurnedOn = false; } public void turnOn() { myTurnedOn = true; } public void checkThread() { if ( myTurnedOn && Thread.CurrentThread != myThread ) { Debug.LogError( "非法线程访问" ); } } public void checkMultiThreadSafety() { if ( myTurnedOn ) { // 需要实现代码来判断方法是否从临界区调用 // 即使同一线程调用也要能检测,而Monitor.IsEntered()仅在其他线程调用时生效 } } }
存在并发访问风险的遗留类
public class SomeLogic { private readonly AsyncChecker myAsyncChecker = new AsyncChecker(); public void logicOne() { myAsyncChecker.checkMultiThreadSafety(); // 业务逻辑A } public void logicTwo() { myAsyncChecker.checkMultiThreadSafety(); // 业务逻辑B } }
预期目标
public void someMethodInDeepLegacyCode() { lock (someLock) { someLogicClassInstance.logicOne(); } } public void anotherSomeMethodInDeepLegacyCode() { someLogicClassInstance.logicTwo(); // 此处未加同步就访问,希望触发异常、断言或错误日志等提示 }
Monitor.IsEntered仅能部分满足需求:仅当从其他线程调用时有效,同一线程调用时无法判断。
内容的提问来源于stack exchange,提问作者zhu
相关产品推荐
相关产品推荐

