有没有办法在每个线程的constexpr thread_local变量中获取不同的值?
constexpr thread_local someType someVar = ......;
似乎支持constexpr thread_local但在这种情况下thread_local指标似乎没有做任何事情。
答案 0 :(得分:0)
如果你想到你的问题,你自己就能明白为什么这是不可能的。
什么是constexpr
?
根据非正式标准网站cppreference:
constexpr说明符声明可以在编译时评估函数或变量的值。
编译器必须在编译时解析该值,并且在整个程序执行过程中该值不应更改。
线程本地存储
相反,线程是一个运行时概念。 C ++ 11将线程概念引入到语言中,因此您可以说编译器可以"意识到"线程概念。 但是,编译器无法始终预测线程是否将被执行(可能只在特定配置时运行线程),或者将生成多少实例等等。
可能的实施
为什么不使用该语言的非常原始的功能,而不是尝试使用黑客和技巧强制访问单个线程的特定模块/方法?
您也可以使用简单的封装来实现这一点。只要确保"看到的唯一对象"您尝试保护的此方法是线程对象本身,例如:
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
class SpecialWorker
{
public:
void start()
{
m_thread = std::move(std::thread(&SpecialWorker::run, this));
}
void join()
{
m_thread.join();
}
protected:
virtual void run() { protectedTask(); }
private:
void protectedTask()
{
cout << "PROTECT ME!" << endl;
}
std::thread m_thread;
};
int main(int argc, char ** argv)
{
SpecialWorker a;
a.start();
a.join();
return 0;
}
请注意,此示例缺少错误处理,不是生产级代码!如果您打算使用它,请务必进行优化。