1)来自WaitForSingleObject : how to get handle from _beginthreadex帖子的回答说,将uintptr_t返回的_beginthreadex强制转换为HANDLE类型是合法的,那么将uintptr_t返回的_beginthread转换为HANDLE类型并不安全吗?
2)我们在32位应用程序中进行了如下转换,并且看起来运行良好,将此应用程序转换为64位时,是否会遇到任何问题?
HANDLE线程=(HANDLE)_beginthread(checkThread,0,&thrVal);
3)是否值得将所有_beginthread调用转换为_beginthreadex?
最佳答案
我认为您所链接问题的答案具有误导性,或者至少是不完整的。根据beginthread()
和beginthreadex()
的文档:
两者之间的区别在于,由beginthread()
启动的线程在退出时会关闭自己的句柄。因此,等待beginthread()
返回的句柄并不安全,因为它可能在您等待时已关闭或回收。但是,如果您可以控制启动的线程(通过使用其他某种形式的同步),则可以调用DuplicateHandle()
来获取可以安全等待的句柄。
在x64构建中,uintptr_t
定义为64位值:
typedef unsigned __int64 uintptr_t;
因此,在这种情况下将其强制转换为
HANDLE
是安全的,并且确实是您要做的事情。_beginthreadex()
使您可以更好地控制新线程,包括以挂起状态启动它并检索线程ID的能力。它还返回一个HANDLE
,由负责关闭的,这意味着可以安全地等待它。它是一种更有用的通用功能,但是如果您不需要这些附加功能,则没有理由仅出于此目的进行切换。