“所有具有线程局部存储持续时间的非局部变量都作为线程启动的一部分进行初始化,在线程函数开始执行之前进行排序。” (https://en.cppreference.com/w/cpp/language/initialization)
但是, cppreference 似乎没有提到这些变量实际上是由正在启动的线程还是由正在启动的线程初始化新线程。
考虑以下示例:
(id.hpp)
#include<thread>
extern thread_local const std::thread::id this_thread_id;
Run Code Online (Sandbox Code Playgroud)
(id.cpp)
#include "id.hpp"
thread_local const std::thread::id this_thread_id = std::this_thread::get_id();
Run Code Online (Sandbox Code Playgroud)
如果我this_thread_id从一个不是主线程的线程访问,我会得到那个线程的 id 吗?如果this_thread_id被初始化为“作为线程启动的一部分”,它也可能由原始调用线程初始化,因此this_thread_id将具有不正确的值。
我知道有一些设计模式可以完全避免这个问题,但这违背了这个问题的全部意义,所以我不想在这里使用它们。