【问题标题】:Difference between gettid and pthread_self for Android NDK?Android NDK 的 gettid 和 pthread_self 之间的区别?
【发布时间】: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


【解决方案1】:

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

上面写着:

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

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

我不确定需要做什么才能获得真正的、唯一的线程句柄。

我在看OpenThread (Win32)函数,但我自己没试过。

要记住的一点是,在 Windows 上,“句柄”是使用后需要清理的资源。对于每个“OpenSomething”函数,请仔细阅读文档,看看是否需要在使用后调用“CloseSomething”。另外,不要假设句柄释放函数总是与创建/复制函数同名。否则可能会破坏系统的稳定性。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2018-01-12
    • 2016-12-02
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多