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规范符声明可以评估 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;
}
请注意,此示例缺乏错误处理,而不是生产等级代码!如果您打算使用它,请确保完善它。
相关文章:
- 从函数角度看ID到文件路径的内部与外部映射
- 通过组合不同的类型来创建唯一的id
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- FFMPEG配置文件级别id大小无效
- 方法内部但循环仍得到预期的不合格id错误C++
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 如何获取 GLFW 窗口 ID?
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 显示数组中的学生 ID 和最高分
- C++:"("令牌"之前有预期的非限定 id 指向类中成员函数的指针
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- Xcode 9.4.1 中的 Apple Mach-O 链接器 (id) 错误
- "local scope"中的 C++ 初始化静态变量
- 错误:令牌 { '{' 之前应存在非限定 ID
- 断言"id < 0"在Qt ActiveX中失败
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 如何根据两个因素组织向量:id 和数量?(C++)
- 在返回 0 之前应为非限定 ID
- Direct3D 11 - HLSL - 获取顶点索引 ID
- 在 /usr/local/lib 下找不到库