【发布时间】:2019-05-28 22:20:35
【问题描述】:
在 C++11 中有 std::this_thread::get_id() 我可以用来获取我的线程的 std::thread::id 标识符。标准说:
30.3.1.1
- thread::id 类型的对象为每个执行线程提供一个唯一标识符,并为所有线程对象提供一个不同的值 不代表执行线程(30.3.1)。的每个线程 执行有一个关联的 thread::id 对象不等于 thread::id 任何其他执行线程的对象,但不是 等于任何不存在的 std::thread 对象的 thread::id 对象 表示执行线程。
- thread::id 应该是一个可简单复制的类(第 9 条)。库可以重用已终止线程的 thread::id 的值 无法再加入。
我的问题正是关于新线程 B 与旧线程 A 具有相同 id 的情况:线程 B 会“看到”线程 A 所做的更改吗?
更具体地考虑这种情况:
线程 A 会:
owner.store(std::this_thread::get_id()); //store A's 'id'
...some work...
owner.store(std::thread::id(),std::memory_order_relaxed); // clear
线程 B 会:
assert(owner.load(std::memory_order_relaxed) != std::this_thread::get_id());
这个断言会成立吗?
线程 A 中的 owner.load 和线程 B 中的最后一个 owner.store 是故意“放松”的,因此两者之间没有明显的“同步”关系,除了我的问题中假设的关系。
【问题讨论】:
-
我不知道你为什么会这样认为?
-
考虑到标准中写的内容,并假设唯一性是考虑物理时间概念化的,即在给定时间没有两个线程id可以相同,那么为了确保标准要求,系统必须确保A 的结束发生在 B 的开始之前。
-
@Oliv,是的,我对整个主题的怀疑实际上归结为标准定义“执行线程”集的“相对时空参考框架”到底是什么。英语(可能是大多数语言)不足以谈论在不同观察者看来可能不同的事物。
标签: c++ multithreading c++11