-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
动态库中的线程如何自理? #15
Comments
动态库中子线程被突然掐断(强行结束)! 除非明确主线程等待,否则都会被动态库强行结束?——非全局变量/静态变量的析构都在主线程之内,肯定会等;也只有全局变量、静态变量的析构会在主线程 可是如果不是动态库中的全局变量/静态变量,而是主程序中的就不存在被强行结束的困惑。 |
如果从未意识到上述状况的存在,那么理解下面这段话可能就有些困难:
由以下描述看出,在
问题核心在于 DLL 什么时候卸载,为什么卸载 DLL 并未等其(指 DLL 中的)静态变量析构执行完毕。所以,问题变成了 crt 相关了。 |
如果动态库(启用线程)析构中不 hModule.0F630000 lpReserved.00EFF980
Process attach.
> 主线程开始
> 主线程结束
hModule.0F630000 lpReserved.00000000
Thread attach.
hModule.0F630000 lpReserved.00000001
Process detach.
子线程第0次析构倒计时;
子线程第1次析构倒计时;
子线程第2次析构倒计时;
子线程第3次析构倒计时;
...
子线程第18次析构倒计时;
子线程第19次析构倒计时;
请按任意键继续. . . 以下无 hModule.0F6D0000 lpReserved.0098F5B4
Process attach.
> 主线程开始
> 主线程结束
hModule.0F6D0000 lpReserved.00000000
Thread attach.
请按任意键继续. . .
答主用了 destroy 而非 destruct,两者等价还是另有玄机? 动态库中的全局变量、静态变量的析构在
|
网上有些帖子提到,动态库中全局变量/静态变量的析构函数未被执行,但我实际测试在 DLL 不启用线程时,在 |
能否捕捉线程是执行完毕退出还是被强行终止的?以便进一步确认主线程退出时杀掉了(做了无效托管的)子线程 join after main 是无效的?main() 之外可以有线程吗? |
在 dll 静态变量/全局变量的析构函数中指明 join() 的线程,进程退出时会被强行结束——这个到底是不是 msvc 的 bug?https://stackoverflow.com/questions/42535990/worker-threads-are-forcibly-terminated-prior-to-the-destruction-of-static-object 使用除了 msvc2015 之外的编译器测试:
没有解决方案:https://stackoverflow.com/questions/43110740/thread-created-by-static-object-deleted-before-dtor
|
见 feature_thread 分支
如果动态库内线程在卸载动态库(
DLL_THREAD_DETACH
)之前结束:如果线程函数耗时较长,即便代码中做了等待指示,但卸载动态库就好会发生莫名其妙的现象:
(等待指示放在动态库全局变量/静态变量的析构函数中,如果是在普通函数(直接或间接被主程序调用,而只要函数调用未结束,就意味着动态库正在使用,不会卸载)就会按部就班等线程函数执行结束)
The text was updated successfully, but these errors were encountered: