thread :: id是否在标准C ++库中的任何位置使用?

时间:2014-09-13 16:33:05

标签: c++ multithreading c++11 c++14

std::thread::get_id()为您提供了一个唯一标识给定线程的实现定义值,但对我来说有趣的是,有一个专用类型,thread::id,这种类型在任何地方使用标准库?

在某个地方或您知道的任何界面中使用thread::id?这种类型的AFAIK无处使用,因此目前它似乎毫无用处。

3 个答案:

答案 0 :(得分:10)

此类用户定义类型的目的是为实现者提供便利。

在许多情况下,您将在现有代码库,OS系统等之上实现C ++线程。这些可能有不同类型的线程识别。

使用该类型,C ++ std实现更有可能直接公开底层线程标识值,或者只需最少的修改。

在客户端的许多情况下,了解您所使用的线程非常有用,并且在没有系统ID的情况下实现它是很复杂的。

std::thread::id可以进行排序,比较(以完全有序的方式,具有合理的相等性)和std::hash ed,所有这些对std库都有用。它们可以被复制(平凡地)并且不带参数构造(对于不代表线程的id)。它们可以通过ostream <<转换为字符串,唯一可以保证结果字符串永远不会相同,除了两个== ID。

除此之外的任何操作都是未定义的。但是,实现可以使thread_id基本上成为指针,或数组中的无符号整数索引,或许多不同的底层实现之一。然而,访问此类信息的实现正在完全依赖于实现。

答案 1 :(得分:4)

  

thread :: id是否在标准C ++库中的任何地方使用?

不,thread::id未在标准C ++库的接口中使用。

它可能用于实现其中一个递归互斥锁,但这将是一个实现细节。我不知道目前是否有任何实现使用它。

  

AFAIK这种类型无处使用,因此它看起来很无用   此刻。

以下是std :: library中的一些其他类型,它们是无用的&#34;根据这个定义:

  • 列表
  • 设置
  • 多重集
  • 地图
  • 多重映射
  • unordered_set
  • unordered_multimap
  • 阵列
  • 原子
  • 位集
  • 复杂
  • condition_variable
  • condition_variable_any
  • 修饰符Modifiers
  • fstream的
  • reverse_iterator的
  • move_iterator
  • 互斥
  • 队列
  • 正则表达式
  • 螺纹

这不是一份详尽的清单。


有点不情愿的更新

我:

  

您的问题是:thread::id的动机用例是什么?

user2485710:

  是的,这听起来是正确的,可能特别关注标准库。

thread::id有时用于将线程映射到属性,反之亦然。例如,可以实现&#34;命名线程&#34;将std::stringstd::thread::id中的std::map相关联。当记录执行线程,或抛出异常,或者有一些值得注意的事件时,可以查找线程的名称来为日志,错误消息等创建消息,以便提供更好的上下文。例如,线程可能具有暗示性名称,例如:&#34;数据库服务器&#34;或者&#34;表格更新者&#34;。

对于此应用程序,

thread::idthread使用起来更方便,因为在其他地方通常需要thread来控制加入。

thread::id的另一个用途是检测执行函数的当前线程是否与执行相同函数的最后一个线程是同一个线程。我已经看到在recursive_mutex::lock()的实现中使用了这种技术。例如,如果互斥锁被锁定并且this_thread::get_id() == stored_id,则增加锁定计数。

至于#34;专注于标准C ++库&#34;我担心,我真的不知道这意味着什么。如果它意味着:&#34;在界面&#34;中使用,那么这个问题在本答案的前面已经得到了解答,在其他答案中也是如此:

  

不,thread::id未在标准C ++库的接口中使用。

std :: lib中有许多类型,它们不属于std :: lib其他部分的API。 thread::id未标准化,因为它在库的其他部分的API中是必需的。它是标准化的,因为std::thread正在标准化,thread::idstd::thread库的自然组成部分,因为它对上述用例非常有用。

threadthread::id之间的主要区别在于thread维护了执行线程的唯一所有权。因此thread是仅移动类型。这与unique_ptr非常类似。只有一个std::thread可用于join()。相比之下,thread::id只是一个&#34;名称&#34;对于thread。名称是可复制的和可比较的。它们不用于所有权,仅用于识别。

在支持仅移动和可复制类型的语言中,这种关注点的分离(特权到连接与识别)变得更加明显。

答案 2 :(得分:2)

  

这种类型的AFAIK无处使用,因此目前它似乎毫无用处。

thread::id实现关系运算符和哈希支持。这允许用户将它们作为关联和无序容器中的键。