【发布时间】:2014-09-25 12:46:41
【问题描述】:
我正在按照“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
}
我的问题是:这个函数实现是否正确? 我对此实现有 3 个主要顾虑:
- 我希望对于 _WIN32,GetCurrentThread 函数会 被用来代替 GetCurrentThreadId,因为我们想要的句柄 线程而不是它的 ID。
- 此外,为什么 gettid() 用于 android 而不是 pthread_self()?我不会使用 gettid 得到错误的 ID(因为 这是系统范围的线程 ID)?
- 最后,仅使用 != 运算符进行比较是否合法 pthread id?不应该改用 pthread_equal 吗?
【问题讨论】:
-
这看起来确实很糟糕——它没有理由在 Android 上使用 gettid() 而不是 pthread_self()。 pthread_equal() 手册页在您的第三点上非常明确,所以我认为您显示的代码是错误的。
-
我也是这么想的。我想我会在亚马逊上写一篇关于这本书的不太正面的评论。他们只是给你代码,一个如何使用这些类的例子,然后他们只是告诉你:好吧,你自己去想办法。
-
与
gettid()与pthread_self()相关:stackoverflow.com/q/6372102/694576
标签: android c++ multithreading android-ndk pthreads