[英]C++ constexpr thread_local id
有没有办法在每个线程的constexpr thread_local变量中获得不同的值?
constexpr thread_local someType someVar = ......;
似乎constexpr thread_local受支持,但在这种情况下thread_local指示符似乎没有任何作用。
如果您考虑自己的问题,您自己会明白为什么这不可能。
什么是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;
}
请注意,此示例缺少错误处理,并且不是生产级代码! 如果要使用它,请确保对其进行优化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.