哪位高手在看核心编程第五版,问个DLL有关问题
谁在看核心编程第五版,问个DLL问题
在《windows核心编程》第五版的539页的最下面两行:
但是,老线程在创建新线程的时候,会导致系统向新线程的 DllMain 发送 DLL_PROCESS_ATTACH 通知
问下,这里是不是弄错了,创建线程不是向 DllMain 发送 DLL_THREAD_ATTACH 吗,怎么成了 DLL_PROCESS_ATTACH ?
=========================================================================================
后面一句说:
由于这时老线程尚未完成对 DllMain 的处理,因此新线程会诶挂起。
在问下,这里的 DllMain 调用顺序,这个顺序好像和通常函数调用顺序不一样啊。通常如果在A函数里调用了B函数,那肯定会等待B结束之后在回到A里继续执行。看书里的意思,这里的 DllMain 好像是异步的,居然会把新产生的调用挂起,等当前 DllMain 结束之后在继续执行刚才挂起的新 DllMain。
------解决思路----------------------
Windows的加载dll时,当dll首次加载到进程空间后会用DLL_PROCESS_ATTACH调用dllmain,调用dllmain的是创建进程时的主线程(进程启动时),或者调用LoadLibrary函数动态加载dll的那个线程(进程运行过程中)。而用DLL_THREAD_ATTACH调用dllmain的情况只发生在CreateThread创建新线程时,系统会依次在新线程中调用所有已经加载的dll的dllmain。
另外,系统调用dllmain时是排它的(相当进程来说),也就是说不管多少线程同时调用LoadLibrary加载不同dll, 只有一个线程会运行它相应的dllmain,其它线程会等待。所以说在dllmain中进行多线程操作很危险容易造成死锁 -- 比如在dllmain中创建一个子线程,然后等待子线程运行结束或等待某个需要子线程修改的同步对象,那么必然造成死锁,因为创建子线程需要用DLL_THREAD_ATTACH调用已加载的dll的dllmain,而运行dllmain又是排他的(当前正在dllmain中),因此子线程的dllmain永远没机会运行,当前dllmain中等待的条件也永远不会满足从而造成死锁。
在《windows核心编程》第五版的539页的最下面两行:
但是,老线程在创建新线程的时候,会导致系统向新线程的 DllMain 发送 DLL_PROCESS_ATTACH 通知
问下,这里是不是弄错了,创建线程不是向 DllMain 发送 DLL_THREAD_ATTACH 吗,怎么成了 DLL_PROCESS_ATTACH ?
=========================================================================================
后面一句说:
由于这时老线程尚未完成对 DllMain 的处理,因此新线程会诶挂起。
在问下,这里的 DllMain 调用顺序,这个顺序好像和通常函数调用顺序不一样啊。通常如果在A函数里调用了B函数,那肯定会等待B结束之后在回到A里继续执行。看书里的意思,这里的 DllMain 好像是异步的,居然会把新产生的调用挂起,等当前 DllMain 结束之后在继续执行刚才挂起的新 DllMain。
------解决思路----------------------
Windows的加载dll时,当dll首次加载到进程空间后会用DLL_PROCESS_ATTACH调用dllmain,调用dllmain的是创建进程时的主线程(进程启动时),或者调用LoadLibrary函数动态加载dll的那个线程(进程运行过程中)。而用DLL_THREAD_ATTACH调用dllmain的情况只发生在CreateThread创建新线程时,系统会依次在新线程中调用所有已经加载的dll的dllmain。
另外,系统调用dllmain时是排它的(相当进程来说),也就是说不管多少线程同时调用LoadLibrary加载不同dll, 只有一个线程会运行它相应的dllmain,其它线程会等待。所以说在dllmain中进行多线程操作很危险容易造成死锁 -- 比如在dllmain中创建一个子线程,然后等待子线程运行结束或等待某个需要子线程修改的同步对象,那么必然造成死锁,因为创建子线程需要用DLL_THREAD_ATTACH调用已加载的dll的dllmain,而运行dllmain又是排他的(当前正在dllmain中),因此子线程的dllmain永远没机会运行,当前dllmain中等待的条件也永远不会满足从而造成死锁。