C++:是否可以使 thread_local 变量成为全局变量?
C++: is it possible to make thread_local variable global?
例如,我的代码中有一个thread_local
变量,但是有一组函数可以访问和修改它。为了模块化,我将它们带到不同的翻译单元(如果我在术语上有误,请纠正我),方法是创建一个 header 及其声明和源文件及其定义。
// fun.h
int fun();
// fun.cpp
#include "fun.h"
int fun()
{
// Modify the thread_local variable here
}
// main.cpp
#include "fun.h"
thread_local int var = 0;
int main()
{
// Modify the var in the main
var = 1;
// Modify the var by calling the fun() from fun.h
fun();
}
怎么办?如何从 fun()
访问它?全局变量对于进程的所有线程都是通用的,但是thread_local是局部的,这不矛盾吗?
变量var
已经是全局变量。 “全局”是指变量的作用域:它是在最外层的命名空间中声明的,因此它的使用不限于特定的块、class或子命名空间。所以一个变量既可以是全局的也可以是线程局部的,没有任何矛盾。
您所要求的只是如何允许其他翻译单元访问这个全局的线程局部变量。好吧,一个明显的解决方案是将 fun
声明为 int fun(int& var)
,因此在 main.cpp
中,您可以将其称为 fun(var)
而不仅仅是 fun()
。如果这样做,您可能不需要全局变量,并且您的代码将更容易推理。但我假设您有充分的理由不能这样做。
如果是这种情况,您应该在 fun.h
:
中提供变量声明
extern thread_local int var;
现在每个包含 fun.h
的翻译单元都知道名为 var
的全局变量的存在,该变量的类型为 int
并且具有线程本地存储持续时间。假定程序中某处的一个翻译单元将提供 var
的定义,而所有其他翻译单元仅引用该变量。 (因为它是一个线程局部变量,这个单一定义创建了一个 set 对象:每个线程一个。)在你的例子中,那个定义 thread_local int var = 0;
在 main.cpp
.
例如,我的代码中有一个thread_local
变量,但是有一组函数可以访问和修改它。为了模块化,我将它们带到不同的翻译单元(如果我在术语上有误,请纠正我),方法是创建一个 header 及其声明和源文件及其定义。
// fun.h
int fun();
// fun.cpp
#include "fun.h"
int fun()
{
// Modify the thread_local variable here
}
// main.cpp
#include "fun.h"
thread_local int var = 0;
int main()
{
// Modify the var in the main
var = 1;
// Modify the var by calling the fun() from fun.h
fun();
}
怎么办?如何从 fun()
访问它?全局变量对于进程的所有线程都是通用的,但是thread_local是局部的,这不矛盾吗?
变量var
已经是全局变量。 “全局”是指变量的作用域:它是在最外层的命名空间中声明的,因此它的使用不限于特定的块、class或子命名空间。所以一个变量既可以是全局的也可以是线程局部的,没有任何矛盾。
您所要求的只是如何允许其他翻译单元访问这个全局的线程局部变量。好吧,一个明显的解决方案是将 fun
声明为 int fun(int& var)
,因此在 main.cpp
中,您可以将其称为 fun(var)
而不仅仅是 fun()
。如果这样做,您可能不需要全局变量,并且您的代码将更容易推理。但我假设您有充分的理由不能这样做。
如果是这种情况,您应该在 fun.h
:
extern thread_local int var;
现在每个包含 fun.h
的翻译单元都知道名为 var
的全局变量的存在,该变量的类型为 int
并且具有线程本地存储持续时间。假定程序中某处的一个翻译单元将提供 var
的定义,而所有其他翻译单元仅引用该变量。 (因为它是一个线程局部变量,这个单一定义创建了一个 set 对象:每个线程一个。)在你的例子中,那个定义 thread_local int var = 0;
在 main.cpp
.