我正在尝试了解CreateThread
和_beginthreadex
之间的区别,以及为什么调用DisableThreadLibraryCalls
只会阻止与_beginthreadex
一起安装的线程执行。
我有一个项目,它是一个DLL,一个旧的DLL,这是一个win32 DLL,我的任务是将它移植到win64。惹恼我的一件事是DLLMain
致DisableThreadLibraryCalls
的电话。
我的线程安装了_beginthreadex
,因为调用DisableThreadLibraryCalls
导致线程的主体从未被执行。删除后,线程正常工作。
现在我发现同一个DLL中的其他线程都是以CreateThread
启动的,我当时认为是调用DisableThreadLibraryCalls
来阻止这些线程执行所以我把它放回去找到无论是否存在CreateThread
s,都会执行使用DisableThreadLibraryCall
创建的线程,但禁用使用_beginthreadex
创建的线程。
为什么呢?我找不到任何东西:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682579(v=vs.85).aspx
这描述了为什么会这样。
答案 0 :(得分:0)
我发现在线参考文件指出_beginthread
和_beginthreadex
通常会调用CreateThread
,因此检查禁用/启用状态可能仅在顶级例程中执行,这些例程会回应我的发现并且对我来说CreateThread
中缺少逻辑。
DisableThreadLibaryCalls
对直接使用CreateThread
创建的主题没有影响。
答案 1 :(得分:0)
CreateThread()
是Windows的本机API,用于创建线程,而_beginthread()
和_beginthreadex()
是C运行时库的一部分,旨在使管理线程的创建更加容易,但它们仍在内部必须致电CreateThread()
。
您自己的答案是错误的,因为在C运行时中没有明确检查启用/禁用。
相反,C运行时库使用DLL_THREAD_ATTACH
和DLL_THREAD_DETACH
回调来管理线程本地存储,因此通过调用DisableThreadLibraryCalls()
禁用这些回调会阻止C运行时线程管理功能也就不足为奇了不能正常工作。