【windows--进程和线程】多线程死锁

来源:互联网 发布:别人盗用身份证开淘宝 编辑:程序博客网 时间:2024/05/21 17:15
 毋庸置疑,在现代软件开发中最难解决的问题是多线程死锁。我将介绍一些自己在进行多线程编程时候的一些技巧和技术,还将介绍一个自己编写的使用程序,DeadlockDetection,它将让你可以看到导致死锁的事件流,这些僵尸你可以用来帮助跟踪哪些内容有问题以及如何在避免相同死锁的唯一证据。

    对于多线程编程,前期规划是可以便面令人套呀的死锁的唯一途径,必要的规划包括:
1、不要做它:多线程很容易到底程序的肯拉屎和测试时间大大增加,因此应该确认有没有其他的办法可以构造这个程序。如果需要自己的程序做一些轻微的后台处理,则应该看是否可以通过使用MFC的OnIdle函数来处理或通过一个后台周期性计时器时间来完成。
2、只在很小的离散部分使用多线程:如果必须进行多线程,则应该试图把多线程保持在很小的离散程序段中。
3、在最低级别上同步:限制同步对象的范围是防止不经意死锁的最好方法。把同步方法放倒代码中尽可能低的级别上,如关键代码段。
4、检查并再次检查代码:记住操作系统有它自己的tsu对象,它应用到你的进程,并且这些对象也可能会引起死锁。进程关键部分以及臭名昭著的WIN98和WIN16互斥都是操作系统在你的进程中使用的同步对象,不过不小心消息处理也坤卦会引起死锁。(如果线程A是UI线程,并且在等债党委为线程B拥有的关键部分,这时如果线程B借助于SendMessage函数发送一条消息给线程A的一个HWND,则将会导致死锁)。
     在多处理器上测试多线程程序!!!
     
     每个进程有一个叫做“进程关键部分”的东西,操作系统在进程中将使用它来同步场景后面的不同操作。在该小组的应用程序中,对LoadLibrary的调用引起操作系统获取进程关键部分使操作系统我可以为DLL_PROCESS_ATTCH情况调用该DLL的DllMain。该DLL的DllMain函数产生第二个线程,无论何时当进程山城一个新线程时,操作系统将获取进程关键部分,以便它可以为DLL_THREAD_ATTACH情况调用每个加载DLL的DllMain函数。在这个特定的程序中,第二个线程阻塞,因为第一个线程还保持着进程关键部分。不幸的是,第一个线程然后调用WaitForSingleObject确认第二个线程能够正确地初始化一些共享对象。因为第二个线程被阻塞在进程关键部分上,这个进程关键部分还被第一个进程所持有,因为它要等待第二个线程而且第一个线程也被阻塞,结果就导致了死锁。


    DeadlockDetection介绍(略)。
原创粉丝点击