4

我刚刚阅读了 IEEE Std 1003.1™,2004 版(POSIX 规范),以确保 mac osx 上的实际线程 ID 是什么。在 POSIX SPEC 的 pthread_equal() 的 RATIONALE 部分中说:

实现可以选择将线程 ID 定义为结构。与使用 int 相比,这允许额外的灵活性和鲁棒性。例如,线程 ID 可以包括允许检测已检测到的线程 ID 的“悬空 ID”副本的序列号)。由于 C 语言不支持结构类型的比较,因此提供了 pthread_equal() 函数来比较线程 ID。

在 Mac OSX 中,pthread_t 被定义为指向名为 '_opaque_pthread_t' 的结构的指针,该结构具有 3 个成员。__sig 是 long 类型,__cleanup_stack 是指向结构的指针,而 __opaque 是 char 类型的数组。

我的第一个问题是:

  1. pthread_t 用于标识线程。它是一个指向 osx 中类型 '_opaque_pthread_t' 的指针。那么,说 _opaque_pthread_t 类型的地址代表 Thread ID 是否正确?
  2. 它的成员 __sig、__cleanup_stack 和 __opaque 是什么?可以吗?我认为作为应用程序开发人员无关紧要吗?

为了找到我的问题的答案,我用谷歌搜索,然后我发现了这个问题:Mac/iPhone: Is there a way to get a thread identifier without using Objective-C?  但它提出了另一个问题。

另一个问题是:

  1. mach_port_t 不是线程 ID。它是一个无符号整数类型,代表 GNU Mach 中的端口名称。它们的含义不同。但是当我只想获得线程的唯一标识符时。mach_port_t 和 pthread_t 是否始终可以交换?
4

1 回答 1

4

在 OS X 上,可以使用 pthread.h 中定义的 pthread_threadid_np。注意 _np 后缀表明它是 POSIX 的扩展。

于 2013-10-08T16:52:00.627 回答