Android NDK中gettid和pthread_self有什么区别?

4

我正在按照《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来代替吗?

3
在 Android 上,这看起来有问题——它使用 gettid() 而不是 pthread_self() 没有任何理由。pthread_equal() 的手册在第三点上很明确,因此我认为你展示的代码是错误的。 - fadden
我也是这么想的。我想在亚马逊上写一篇不太正面的评论,关于这本书。他们只是给你代码,一个如何使用类的示例,然后告诉你:好吧,你自己去摸索吧。 - ChrisV
gettid()pthread_self()相关的问题: https://dev59.com/6mw15IYBdhLWcg3w0fKh - alk
1个回答

2

我只会评论GetCurrentThread (Win32)这一部分。

它的意思是:

“检索调用线程的句柄。”

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

我不确定要获取真正的唯一句柄需要做什么。

我正在研究OpenThread (Win32)函数,但我自己还没有尝试过。

需要记住的一件事是,在Windows上,“句柄”是需要在使用后清理的资源。对于每个“OpenSomething”函数,请仔细阅读文档,以查看是否需要在使用后调用“CloseSomething”。此外,不要假定句柄释放函数总是与创建/复制函数具有相同的名称。不这样做可能会使系统不稳定。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接