thread::id 是否在标准 C++ 库中的任何地方使用?
不,thread::id 没有在标准 C++ 库的接口中使用。
它可能用于递归互斥锁之一的实现,但这将是一个实现细节。我不知道当前是否有任何实现使用它。
AFAIK 这种类型无处使用,因此看起来毫无用处
目前。
以下是 std::library 中的一些其他类型,根据这个定义是“无用的”:
- 列表
- 设置
- 多组
- 地图
- 多地图
- unordered_set
- unordered_multimap
- 数组
- 原子的
- 位集
- 复杂
- 条件变量
- condition_variable_any
- forward_list
- fstream
- reverse_iterator
- move_iterator
- 互斥体
- 队列
- 堆栈
- 正则表达式
- 线程
这不是一个详尽的列表。
有点不情愿的更新
我:
您的问题是:thread::id 的激励用例是什么?
用户2485710:
是的,听起来不错,也许是对标准库的特别关注。
thread::id 有时用于将线程映射到属性,反之亦然。例如,可以通过在std::map 中将std::string 与std::thread::id 相关联来实现“命名线程”。当一个执行线程被记录、抛出异常或有一些值得注意的事件时,可以查找线程的名称来为日志、错误消息等创建一条消息,以便提供更好的上下文。例如,线程可能具有暗示性名称,例如:“数据库服务器”或“表更新器”。
thread::id 比 thread 更方便用于此应用程序,因为在其他地方通常需要 thread 来控制加入。
thread::id 的另一个用途是检测当前执行函数的线程是否与执行相同函数的最后一个线程相同。我已经看到在recursive_mutex::lock() 的实现中使用了这种技术。例如,如果互斥锁被锁定并且this_thread::get_id() == stored_id,则增加锁定计数。
至于“专注于标准 C++ 库”,我真的不知道这是什么意思。如果它的意思是:“在界面中使用”,那么这个问题已经在这个答案的前面得到了回答,在其他答案中:
不,thread::id 没有在标准 C++ 库的接口中使用。
std::lib 中有很多很多类型不是 std::lib 其他部分的 API 的一部分。 thread::id 未标准化,因为库的其他部分的 API 需要它。它之所以被标准化是因为 std::thread 正在被标准化,而 thread::id 是 std::thread 库的自然组成部分,并且因为它对上述用例很有用。
thread 和thread::id 之间的主要区别在于thread 维护执行线程的唯一所有权。因此thread 是只移动类型。这与unique_ptr 非常相似。 join() 只能使用一个std::thread。相反,thread::id 只是thread 的“名称”。名称是可复制和可比较的。它们不用于所有权,仅用于识别。
这种关注点分离(加入特权与标识)在支持仅移动和可复制类型的语言中更加明显。