我正在按照《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
}
我的问题是:这个函数的实现是否正确?我对这个实现有三个主要关注点:
- 我希望在WIN32环境下,应该使用GetCurrentThread函数而不是GetCurrentThreadId函数,因为我们需要线程的句柄而不是其ID。
- 此外,为什么在android中使用gettid()而不是pthread_self()?使用gettid会得到错误的ID吗(因为这是系统范围内的线程ID)?
- 最后,仅使用!=运算符来比较pthread IDs是否合法?难道不应该使用pthread_equal来代替吗?
gettid()
和pthread_self()
相关的问题: https://dev59.com/6mw15IYBdhLWcg3w0fKh - alk