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,由负责关闭的,这意味着可以安全地等待它。它是一种更有用的通用功能,但是如果您不需要这些附加功能,则没有理由仅出于此目的进行切换。

08-04 16:08