什么网站可以做饼图,外贸公司英文网站建设,网络绿化网站建设哪家专业,深圳市8号公告有人碰到了一个死锁问题#xff0c;找到我们想请我们看看#xff0c;这个是关于应用程序用户界面相关的死锁问题。
我也不清楚他为什么会找上我们#xff0c;可能是因为我们经常会和窗口管理器打交道吧。
下面#xff0c;我们来看看死锁的两个线程。 请移步至 …有人碰到了一个死锁问题找到我们想请我们看看这个是关于应用程序用户界面相关的死锁问题。
我也不清楚他为什么会找上我们可能是因为我们经常会和窗口管理器打交道吧。
下面我们来看看死锁的两个线程。 请移步至 www.topomel.com 以查看图片
调试死锁的问题在于你通常不太需要了解具体的技术细节。一旦你踏入大门诊断在很大程度上是机械化的。(尽管有时很难踏入大门。)
让我们先看看线程 0。
它正在等待一个临界区。该临界区的所有者是线程 1。我是怎么知道的 好吧我本可以调试它或者我可以用我的第六感说”天哪那个函数叫做 LogMsg看函数 LogMsg 里面有另一个线程。我敢打赌该函数正在使用一个关键部分以确保一次只有一个线程使用它。”
好的现在我们知道第一个线程 0 正在等待线程 1。线程 1 在做什么
好吧它回到了 LogMsg 函数中的关键部分然后它做了一些文本处理哦看它正在执行 SetScrollInfo。SetScrollInfo 进入 comctl32 并最终生成 SetWindowLong。
应用程序传递给 SetScrollInfo 的窗口由线程 0 拥有。我又是怎么知道 好吧我本可以调试它或者再次使用我的第六感说”天哪滚动信息的变化导致了窗口样式的改变线程正试图通知窗口样式的变化。该窗口显然属于另一个线程;否则我们一开始就不会被卡住而且鉴于我们只看到两个线程对于其他线程可能是什么没有太多选择!”
在这一点上我们就看到了死锁的场景。线程 0 正在等待线程 1 退出临界区但线程 1 正在等待线程 0 处理样式更改消息。
这里发生的事情是程序在持有临界区时发送了一条消息。
由于消息处理可以触发钩子和跨线程活动因此在发送消息时不能保留任何资源因为钩子或消息接收者可能想要获取你拥有的资源从而导致死锁。
总结
这个死锁场景似曾相识在拓扑梅尔智慧办公平台 (Topomel Box) 中我们大量的使用了工作线程当工作线程需要操作用户界面的时候我们简单的遵循一个规则向目标窗口投递 (Post) 消息而不是直接使用 Win32 API 直接对用户界面进行操作甚至我们也会十分谨慎的使用发送(Send)消息这样一种阻塞调用。
我们始终遵守这样一则铁律。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一里面有很多关于Windows的小知识对于广大Windows平台开发者来说确实十分有帮助。 本文来自《Psychic debugging: The first step in diagnosing a deadlock is a simple matter of following the money》
最近我写了个东西
正如你们所知道的拓扑梅尔智慧办公平台(TopomelBox)是一款绿色软件主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能同时操作上尽可能地简单方便。 我想你值得拥有。