繁体   English   中英

C ++ constexpr thread_local ID

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM