gpt4 book ai didi

c++ - DLL CreateThread、DisableThreadLibraryCalls 和 _beginthreadex

转载 作者:太空宇宙 更新时间:2023-11-04 14:29:16 26 4
gpt4 key购买 nike

我试图了解 CreateThread_beginthreadex 之间的区别,以及为什么调用 DisableThreadLibraryCalls 只会阻止使用 安装的线程_beginthreadex 从执行开始。

我有一个项目,它是一个 DLL,一个旧的 DLL,这是一个 win32 dll,我的任务是将它移植到 win64。让我感到困惑的一件事是在 DLLMain 中调用 DisableThreadLibraryCalls

我的线程是使用 _beginthreadex 安装的,由于调用 DisableThreadLibraryCalls,线程的主体从未被执行。一旦我删除它,线程就会正常工作。

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

为什么?我在以下位置找不到任何内容:

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

这描述了为什么会发生这种情况。

最佳答案

CreateThread() 是用于创建线程的 Windows native API,而 _beginthread()_beginthreadex() 是 C 运行时库的一部分,并且旨在更轻松地管理线程创建,但它们仍然必须在内部调用 CreateThread()

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

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

关于c++ - DLL CreateThread、DisableThreadLibraryCalls 和 _beginthreadex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49670473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com