我有一个维护一个列表的对象;的辅助方法一个需要断言当前线程没有保存一个CRITICAL_SECTION锁
- 锁定列表
- 找到的第一个元素
- 解锁名单
- 通知另一个线程来开始清除操作
- 等待另一个线程来完成
- 重复此操作,直到列表为空。
清理操作从另一个线程的列表中删除对象,因此它需要锁定其中的列表。
这工作正常,只要帮助器没有调用列表上的锁已被占用,然后解锁操作实际上不会允许其他线程访问列表,所以我想标记错误这个案例。
据我所知,CRITICAL_SECTION
API没有提供官方支持的方式来查询当前进程是否持有这个对象,所以我正在考虑“hack-ish”方法(毕竟,这是一个调试援助和不打算进入生产代码):
变1是检查CRITICAL_SECTION
结构的OwningThread
领域,但我不知道是否有保证,这个领域是
- 总是包含一个线程来自与
GetCurrentThreadId()
结果相同的编号空间的ID - 当任何线程需要锁
- 总是被清零时,我自己的线程释放锁总是更新
变2是锁定CRITICAL_SECTION
然后检查RecursionCount
;这假定递归计数器具有固定的起始值。
有没有什么我错过了,我可以用它来构建一个有点面向未来的(也就是说,它会在一行代码中喧闹地接近我解释的全部注释)assertion statement目前的线程是不是的持有者是一定的CRITICAL_SECTION
?
你不能依赖于任何一个关键部分结构,因为它们是实现依赖,且执行近来已经改变的领域。 – 2012-02-15 09:30:24
因此[tag:hack]标签。 – 2012-02-15 09:34:12
你的设计听起来很不错。您正在尝试检测调用线程是否已锁定?如果你不知道锁定任何给定的代码段,那么你几乎没有机会编写正确和无死锁的代码。 – 2012-02-15 09:59:49