【发布时间】:2013-08-23 18:37:23
【问题描述】:
pthread_t(由pthread_self() 返回)是不透明类型,但在某些平台上实际上是数字,例如typedefed 到unsigned long。在这些平台上,0 是无效的 pthread_t 值吗? -1呢?
【问题讨论】:
-
我认为这不是重复的,因为我问的是特定于平台的行为而不是一般情况。
pthread_t(由pthread_self() 返回)是不透明类型,但在某些平台上实际上是数字,例如typedefed 到unsigned long。在这些平台上,0 是无效的 pthread_t 值吗? -1呢?
【问题讨论】:
如果我想要一个 pthread_t 或无效的值,我会使用 C++1y 中的 boost::optional<pthread_t> 或 std::optional<pthread_t>。
这几乎没有开销(字节),表达了我想要的(这个值可能是也可能不是pthread_t),并且不依赖于特定于平台的行为。
【讨论】:
optional 或标志可能是最好的通用选项。但我特别将pthread_t 的使用限制在它是数字的平台上,正是因为它允许我在没有任何开销的情况下使用它(我将它放入std::atomic)。
optional 放在 atomic 中(我正在构建一个以线程 ID 作为键的无锁哈希表,我需要知道表中的给定插槽是否是免费或不完全基于其价值,并一次全部交换)。我想如果 sizeof(optional<pthread_t>) 是 64 位,我可以使用双宽 CAS 操作。