首页
社区
课程
招聘
[讨论]关于在DLL中创建线程的问题
发表于: 2013-3-13 16:38 20581

[讨论]关于在DLL中创建线程的问题

2013-3-13 16:38
20581
最近写个DLL,需要在内部创建两个工作线程,但很快发现在DllMain中创建线程会引来死锁。

翻看资料,《windows核心编程》上边提供了一个初步的解决方案(在后面又被否定了):使用DisableThreadLibraryCalls通知系统你不想将DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知发送给特定的DLL的DllMain,这样就不会发送死锁条件。

但作者很快发现这解决不了问题,真正的解决方案是重新设计这部分代码,是的WaitForSingleObject不会在任何DLL中的DllMain函数中被调用。

可是,,,这部分代码究竟要如何重新设计,作者没有进一步地分析了。

看雪牛人众多,能否给出在DLL中创建线程的解决方案?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 203
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
izc
2
补充说明下:
这不是作为Svchost服务启动的DLL,没有ServiceMain。
2013-3-13 16:45
0
雪    币: 350
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
DllMain返回前新建的线程都会被
RtlEnterCriticalSection(&ntdll.LdrpLoaderLock);
阻塞

你不去Wait新建的线程就好了
2013-3-13 17:18
0
雪    币: 106
活跃值: (554)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
DllMain和多线程死锁
http://www.cnblogs.com/zhangdongsheng/archive/2012/06/12/2545744.html
2013-3-13 17:25
0
雪    币: 203
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
izc
5
创建的两个工作线程都是带有while(1)的,需要处理网络连接,不使用WaitXXXX函数不好使也。
2013-3-13 17:44
0
雪    币: 297
活跃值: (235)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
6
我也遇到同样的问题
dllmain中创建线程,没有wait
但是照样死锁了
2013-3-13 17:57
0
雪    币: 203
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
izc
7
刚刚测试了下,单线程貌似没有问题,但是需要创建两个工作线程啊,在线程中再创建线程。这代码就没辙了。。。
2013-3-13 18:04
0
雪    币: 203
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
izc
8
共勉吧   
2013-3-13 18:05
0
雪    币: 260
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
试试这个,看看行吗?
LdrUnlockLoaderLock(1,(GetCurrentThreadId() & 0xfff)<<16);
LdrUnlockLoaderLock链接到ntdll.lib
2013-3-16 18:41
0
雪    币: 3246
活跃值: (364)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
10
DllMain()中不要干复杂的事情,因为持有loader锁时干复杂事情很容易死锁。

可以让dll导出一对Init()/CleanUp()的函数,用于做全局初始化(比如创建线程)、全局清理(比如等待线程退出,不等待线程退出就会非法操作)。
2013-3-18 16:12
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
不做线程等待就可以了啊
创建了线程就关闭句柄,或者在dll卸载的时候关闭句柄
2013-3-18 17:04
0
雪    币: 3246
活跃值: (364)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
12
在DLL中创建的线程,必须在DLL unload之前等待其退出,不然线程体对应的代码区域被unload了,就崩了
2013-3-21 19:00
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
创建一个时钟不知道可以不,然后再在时钟里创建线程,并停掉时钟~~~
2013-3-22 09:11
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
同楼主一样,求解!!!!
2017-5-31 15:44
0
雪    币: 4441
活跃值: (805)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15

如果是MFC中的话,使用C++库函数_beginthread  ()、_beginthreadEx  (),不要使用MFC的线程函数就行了

2017-5-31 17:23
0
雪    币: 243
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
jackZhan 同楼主一样,求解!!!!
如果你的线程是即时退出,那你可以wait,如果不能,那就不要在DLL_PROCESS_ATTACH里面wait线程,DLL_PROCESS_ATTACH创建的线程不会调用DLL_THREAD_ATTACH,另外,线程一般无需回收,因为回收也没用,当程序卸载dll的时候,系统会帮你把所有的在dll中创建的线程都关闭,所以即使你在DLL_PROCESS_DETACH里面去回收线程也是没用的,系统在调用DLL_PROCESS_DETACH之前就已经把线程回收了,所以说不建议在DLL_PROCESS_ATTACH里面创建线程,如果创建,那就要好好设计你的线程不要造成死锁和内存泄漏,一般情况下需要写一个接口来做释放,但在dll注入,劫持等情况下只能在DllMain中创建线程,此时就需要多加小心,以免造成程序崩溃或者无响应
2017-6-1 11:01
0
游客
登录 | 注册 方可回帖
返回
//