DLL CreateThread,DisableThreadLibraryCalls和_beginthreadex

时间:2018-04-05 10:46:52

标签: c++ multithreading

我正在尝试了解CreateThread_beginthreadex之间的区别,以及为什么调用DisableThreadLibraryCalls只会阻止与_beginthreadex一起安装的线程执行。

我有一个项目,它是一个DLL,一个旧的DLL,这是一个win32 DLL,我的任务是将它移植到win64。惹恼我的一件事是DLLMainDisableThreadLibraryCalls的电话。

我的线程安装了_beginthreadex,因为调用DisableThreadLibraryCalls导致线程的主体从未被执行。删除后,线程正常工作。

现在我发现同一个DLL中的其他线程都是以CreateThread启动的,我当时认为是调用DisableThreadLibraryCalls来阻止这些线程执行所以我把它放回去找到无论是否存在CreateThread s,都会执行使用DisableThreadLibraryCall创建的线程,但禁用使用_beginthreadex创建的线程。

为什么呢?我找不到任何东西:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682579(v=vs.85).aspx

这描述了为什么会这样。

2 个答案:

答案 0 :(得分:0)

我发现在线参考文件指出_beginthread_beginthreadex通常会调用CreateThread,因此检查禁用/启用状态可能仅在顶级例程中执行,这些例程会回应我的发现并且对我来说CreateThread中缺少逻辑。

DisableThreadLibaryCalls对直接使用CreateThread创建的主题没有影响。

答案 1 :(得分:0)

CreateThread()是Windows的本机API,用于创建线程,而_beginthread()_beginthreadex()是C运行时库的一部分,旨在使管理线程的创建更加容易,但它们仍在内部必须致电CreateThread()

您自己的答案是错误的,因为在C运行时中没有明确检查启用/禁用。

相反,C运行时库使用DLL_THREAD_ATTACHDLL_THREAD_DETACH回调来管理线程本地存储,因此通过调用DisableThreadLibraryCalls()禁用这些回调会阻止C运行时线程管理功能也就不足为奇了不能正常工作。