在标准C++库中的任何位置都使用了thread::id

Is thread::id used anywhere in the standard C++ library?

本文关键字:thread id 位置 C++ 标准 任何      更新时间:2023-10-16

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

thread::id在您知道的任何地方或任何接口中使用?AFAIK这种类型在任何地方都没有使用,因此目前看起来它很无用。

这种用户定义类型的目的是让实现者更容易。

在许多情况下,您将在现有的代码库、操作系统等之上实现C++线程。这些可能具有不同类型的螺纹标识。

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

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

std::thread::id可以排序、比较(以完全有序的方式,具有明显的相等性)和std::hashed,所有这些都对std库有用。它们可以被复制(很普通),并且可以在没有参数的情况下构建(对于表示没有线程的id)。它们可以通过ostream <<转换为一个字符串,唯一的保证是,除了两个== ID之外,生成的字符串永远不会相同。

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

thread::id在标准C++库中的任何位置都使用过吗?

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

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

AFAIK这种类型在任何地方都没有用,所以看起来很没用目前。

以下是std::库中的一些其他类型,根据以下定义它们是"无用的":

  • 列表
  • 集合
  • 多集
  • 地图
  • 多映射
  • 无序集合
  • 无序多映射
  • 阵列
  • 原子的
  • 位集
  • 复合体
  • 条件变量
  • condition_variable_any
  • 转发列表
  • fstream
  • 反向器
  • move_iterator
  • 互斥
  • 队列
  • 烟囱
  • 正则表达式
  • 螺纹

这不是一个详尽的清单。


有些不情愿的更新

我:

您的问题是:thread::id的激励性用例是什么?

user2485710:

是的,听起来不错,也许,特别关注标准库。

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

CCD_ 16比CCD_ 17更方便地用于此应用程序,因为CCD_。

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

就"关注标准C++库"而言,我真的不知道这意味着什么。如果它的意思是:"在界面中使用",那么这个问题已经在这个答案的前面得到了回答,在其他答案中:

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

std::lib中有很多类型,它们不是std::lib其他部分的API的一部分。thread::id没有标准化,因为它在库的其他部分的API中是需要的。它之所以被标准化是因为std::thread正在被标准化,而thread::idstd::thread库的自然组成部分,并且因为它对上述用例很有用。

threadthread::id之间的关键区别在于thread维护执行线程的唯一所有权。因此CCD_ 30是一种仅移动类型。这与unique_ptr非常相似。join()只能使用一个std::thread。相反,thread::id只是thread的"名称"。名称具有可复制性和可比性。它们不用于所有权,仅用于身份识别。

在一种同时支持移动类型和可复制类型的语言中,这种关注点的分离(加入特权与标识)变得更加明显。

AFAIK这种类型在任何地方都没有使用,因此目前看起来它很无用。

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