首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于Android的gettid和pthread_self的区别?

用于Android的gettid和pthread_self的区别?
EN

Stack Overflow用户
提问于 2014-09-25 12:46:41
回答 1查看 3.1K关注 0票数 3

我正在效仿"Android游戏开发手册“中的例子,创建一个跨平台线程包装器,供我自己的Android游戏引擎使用。在示例的thread类中,在某个点进行检查,查看线程句柄是否与当前线程相对应。这项工作如下:

代码语言:javascript
复制
if ( GetCurrentThread() != FThreadHandle )

FThreadHandle句柄是使用前面的折叠调用分配的:

代码语言:javascript
复制
#if defined(_WIN32)
    FThreadHandle = ( uintptr_t )_beginthreadex( NULL, 0, &ThreadStaticEntryPoint, ThreadParam, 0, &ThreadID );
#else
    pthread_create( &FThreadHandle, NULL, ThreadStaticEntryPoint, ThreadParam );
#endif

getCurrentThread函数的定义如下:

代码语言:javascript
复制
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?
  • 最后,只使用!=操作符比较p线程ids合法吗?难道不应该用pthread_equal吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-11 05:05:48

我只想评论一下(Win32)部分。

上面写着:

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

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

我不知道需要做什么才能得到一个真正的,独特的线程句柄。

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

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

最后但并非最不重要的是:尝试在旧的新事物上搜索。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26039042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档