C ++ constexpr thread_local id

时间:2017-09-29 12:55:49

标签: c++ c++14 constexpr thread-local

有没有办法在每个线程的constexpr thread_local变量中获取不同的值?

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

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

1 个答案:

答案 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;
}

请注意,此示例缺少错误处理,不是生产级代码!如果您打算使用它,请务必进行优化。