Android NDK的gettid和pthread_self之间的区别?

时间:2014-09-25 12:46:42

标签: android c++ multithreading android-ndk pthreads

我正在关注" 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。
  • 此外,为什么gettid()用于android而不是 pthread_self()?我不会使用gettid得到错误的id(因为 这是一个系统范围的线程id)?
  • 最后,使用!=运算符进行比较是否合法 pthread ids?难道不能使用pthread_equal吗?

1 个答案:

答案 0 :(得分:0)

我将对GetCurrentThread (Win32)部分发表评论。

它说:

  
    

"检索调用线程的 句柄。"

  

换句话说,如果从不同的线程调用它,每个线程可能会收到相同的伪造句柄。或者,换句话说,返回的值可能只是一个常量值,Win32 API将其识别为代表当前线程的占位符。

我不确定需要做些什么才能获得该线程真正独特的句柄。

我正在查看OpenThread (Win32)功能,但我自己没有尝试过。

要记住的一件事是在Windows上,"处理"是使用后需要清理的资源。对于每个" OpenSomething"功能,仔细阅读文档,看看是否需要调用" CloseSomething"使用后。另外,不要假设句柄释放功能始终与创建/复制功能具有相同的名称。如果不这样做可能会破坏系统稳定性。

最后但并非最不重要:尝试搜索The Old New Thing