我正在关注" Android NDK游戏开发指南中的示例"用于创建跨平台线程包装器,以便在我自己的Android NDK游戏引擎中使用。 在示例的Thread类中,在某一点上,进行检查以查看线程句柄是否对应于当前线程。这样做如下:
if ( GetCurrentThread() != FThreadHandle )
FThreadHandle句柄是使用之前的后续调用分配的:
#if defined(_WIN32)
FThreadHandle = ( uintptr_t )_beginthreadex( NULL, 0, &ThreadStaticEntryPoint, ThreadParam, 0, &ThreadID );
#else
pthread_create( &FThreadHandle, NULL, ThreadStaticEntryPoint, ThreadParam );
#endif
getCurrentThread函数定义如下:
native_thread_handle_t iThread::GetCurrentThread()
{
#if defined( _WIN32)
return GetCurrentThreadId();
#elif defined( ANDROID )
return gettid();
#else
return pthread_self();
#endif
}
我的问题是:这个功能实现是否正确? 我对此实施有三个主要担忧:
答案 0 :(得分:0)
我将对GetCurrentThread
(Win32)部分发表评论。
它说:
"检索调用线程的 伪 句柄。"
换句话说,如果从不同的线程调用它,每个线程可能会收到相同的伪造句柄。或者,换句话说,返回的值可能只是一个常量值,Win32 API将其识别为代表当前线程的占位符。
我不确定需要做些什么才能获得该线程真正独特的句柄。
我正在查看OpenThread (Win32)功能,但我自己没有尝试过。
要记住的一件事是在Windows上,"处理"是使用后需要清理的资源。对于每个" OpenSomething"功能,仔细阅读文档,看看是否需要调用" CloseSomething"使用后。另外,不要假设句柄释放功能始终与创建/复制功能具有相同的名称。如果不这样做可能会破坏系统稳定性。
最后但并非最不重要:尝试搜索The Old New Thing。