DeadLock的一个可怕后果就是UI Hang住了(界面没反应),你一般会看到这个进程是Shell32.exe。

 

现在遇到一个Theme相关的Dead Lock问题:
\DumpFile\Dead Lock\20100704_DeadLock_poutlook.exe
\DumpFile\Dead Lock\20100703_DEADLOCK_poutlook.exe
\DumpFile\Dead Lock\20100627_DEADLOCKpoutlook.exe
\DumpFile\Dead Lock\20100622_DEADLOCKpoutlook.exe
\DumpFile\Dead Lock\20100707_DeadLockpoutlook.exe

如果用户改了theme,CThemePrimitive::UpateThread就会wake up起来
去更新theme的设置

这个时候会先enter theme内部的一个锁,然后调GDI的API做一些绘制的操作,当然GWES内部也有一个锁需要lock
另一方面GWES Control,在实现绘制的时候,需要调用theme API得到theme的设置
在调到theme API之前,因为是GWES的Control所以已经获得了GWES内部的锁,于是dead lock
两个锁theme的和GWES的,加锁的顺序反了