DLL CreateThread, DisableThreadLibraryCalls and _beginthread
DLL CreateThread, DisableThreadLibraryCalls and _beginthreadex
我试图了解CreateThread
和_beginthreadex
之间的区别,以及为什么调用DisableThreadLibraryCalls
只会阻止安装_beginthreadex
的线程执行。
我有一个项目,它是一个DLL,一个旧的DLL,这是一个win32 dll,我的任务是将其移植到win64。 让我绊倒的一件事是DLLMain
给DisableThreadLibraryCalls
打电话。
我的线程是用_beginthreadex
安装的,线程的主体从未被执行,因为调用DisableThreadLibraryCalls
。 删除它后,线程工作正常。
现在我发现同一 DLL 中的其他线程都是以CreateThread
开头的,然后我认为是调用DisableThreadLibraryCalls
那里以防止这些线程执行,所以我把它放回去,发现用CreateThread
创建的线程被执行,无论是否存在DisableThreadLibraryCall
s,但用_beginthreadex
创建的线程被禁用。
为什么? 我找不到任何内容:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682579(v=vs.85).aspx
这描述了为什么会发生这种情况。
CreateThread()
是一个用于创建线程的 Windows 本机 API,而_beginthread()
和_beginthreadex()
是 C 运行时库的一部分,旨在更轻松地管理线程创建,但它们仍然必须在内部调用CreateThread()
。
您自己的答案是错误的,因为 C 运行时中没有显式检查启用/禁用。
相反,C 运行时库使用DLL_THREAD_ATTACH
和DLL_THREAD_DETACH
回调来管理线程本地存储,因此通过调用DisableThreadLibraryCalls()
来禁用这些回调会阻止 C 运行时线程管理函数正常工作也就不足为奇了。
我在网上找到了参考资料,指出_beginthread
和_beginthreadex
内部调用CreateThread
所以也许检查禁用/启用状态仅在顶级例程中执行,这确实呼应了我的发现,对我来说,CreateThread
中缺少逻辑。
DisableThreadLibaryCalls
对直接使用CreateThread
创建的线程没有影响。
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- python ctypes and C++ pointers
- C++ const char with .begin() and .end()
- Threads with Classes and std::packaged_task
- libgphoto2 and Visual Studio 2019