C++ constexpr thread_local id

C++ constexpr thread_local id

本文关键字:local id thread constexpr C++      更新时间:2023-10-16

是否有任何方法可以在每个线程中获得constexpr thread_local变量的不同值?

constexpr thread_local someType someVar = ......;

似乎支持constexpr thread_local,但是在这种情况下,thread_local指示器似乎没有做任何事情。

如果您考虑自己的问题,您自己可以看到为什么不可能。

什么是constexpr

根据非正式标准网站cppreference:

constexpr规范符声明可以评估 compile time 的函数或变量的值。

编译器必须在编译时间解析值,并且该值在程序的整个执行过程中不应更改。

线程 - 本地存储

相反,

线程是一个运行时概念。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;
}

请注意,此示例缺乏错误处理,而不是生产等级代码!如果您打算使用它,请确保完善它。