2015-09-28 91 views
7

从我的经验,似乎的std :: thread :: id跨进程唯一吗?

std::this_thread::get_id() 

结果是在工艺独特:ID是从一个过程到另一个不同。

这是由标准保证的吗?

+0

你现在要求专门为linux上的gcc还是一般的C++?答案似乎不同。 – nwp

+0

我的问题是关于一般的C++标准。我正在寻找所有平台和所有编译器的答案。 –

+5

该标准没有任何“过程”的概念,任何几个程序可能同时运行和交互的概念。所以这个问题甚至不能用标准的术语来表达,更不用说回答了。所有你可以问的是“典型的实现会做什么?” –

回答

1

std :: thread是在支持pthread的环境中的pthreads之上实现的。所以它成为没有(便携式)保证。

pthread_self手册:

线程ID被保证只有内的进程是唯一的。 A
线程ID可能在已加入终止的线程后重新使用,或者分离的线程已终止 。

+3

这并不回答C++标准要求的问题,它只是意味着如果C++标准要求线程ID在进程间是唯一的,那么实现不能简单地重用pthread ID。 (但它确实使得C++标准可能不需要线程ID在整个进程中是唯一的。) – hvd

+0

@ hvd是的,但std :: thread是在支持pthread的环境中的pthread上实现的。所以它成为没有(便携式)保证。 – PSIAlt

+2

你可以添加一个'std :: thread'在pthreads的顶部实现的clam的源代码吗?我无法想象这个标准。我也相当肯定Windows是一个反例,因为pthreads可用并且不用于实现'std :: thread',它们都使用本地WinApi实现。但是,微软并不是第一次不符合标准。 – nwp

2

标准受赠该线程ID在不同的线程独特的,它也表示,终止线程ID可能被重用。它没有指定进程,也没有确认它们的存在,因此,它不能保证跨进程的唯一性。

30.3.1.1

  1. 类型线程的一个目的:: ID提供用于执行的每个线程并为所有线程的单个独特的值的唯一标识符的对象 不表示执行的线程(30.3.1)。 执行的每个线程都有一个关联的线程:: id对象,它不等于任何其他执行线程的 线程:: id对象,而不是 等于任何std ::线程的线程:: id对象不是 的对象表示执行的线程。
  2. thread :: id应该是一个可以复制的类(第9章)。该库可以重用不能再被连接的已终止线程 的线程:: id的值。

该标准还隐藏了一个线程::标识的实施,它可能是一个int或别的东西。