gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:52:29 24 4
gpt4 key购买 nike

我正在按照“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 吗?

最佳答案

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

它说:

"Retrieves a pseudo handle for the calling thread."

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

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

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

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

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

关于android - Android NDK 的 gettid 和 pthread_self 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26039042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com