- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我试图了解 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_ATTACH
和 DLL_THREAD_DETACH
回调来管理线程本地存储,因此通过调用 DisableThreadLibraryCalls() 禁用这些回调也就不足为奇了
正在阻止 C 运行时线程管理函数正常工作。
关于c++ - DLL CreateThread、DisableThreadLibraryCalls 和 _beginthreadex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49670473/
我试图了解 CreateThread 和 _beginthreadex 之间的区别,以及为什么调用 DisableThreadLibraryCalls 只会阻止使用 安装的线程_beginthread
我是一名优秀的程序员,十分优秀!