thread_local 与 C++ 中的局部变量
thread_local vs local variable in C++
谁能简单明了地解释一下 i 和 j 变量的区别?
#include <thread>
using namespace std;
void f(int n)
{
thread_local int i = n;
int j = n;
}
int main()
{
thread t1(f, 1);
thread t2(f, 2);
t1.join();
t2.join();
return 0;
}
当省略 static
时,thread_local
表示 static
。
局部 static
变量在多次调用给定函数时保留其值。您可以在其他地方阅读有关 static
变量的信息。
现在,我假设您确实知道 static
变量是什么 - 重要的是:
- 静态变量具有 局部作用域
- (but)静态变量全局存在
第二点使其他函数可以通过 C++ 引用和指针访问静态变量的内存 - 它证明静态变量只有一个副本 - 跨越进程的 所有线程 .您需要知道线程是什么以及如何 create/program 线程。
现在,进入正题。您知道 Global 变量具有全局作用域和全局可访问性,但是当您 运行 程序的两个或多个实例时,其中的 both/all 会有一个单独的副本该全局变量的。这意味着每个 进程 都会有该全局变量的单独副本。
那么,如果您希望每个线程都有一个 static
变量的单独副本怎么办?您使用 thread_static
。每个线程都有该静态变量的单独副本。
有趣的是,您还可以将 thread_local
应用于全局变量 - 因此每个线程也会收到这些全局变量的单独副本!
// Globals
int counter;
thread_local int this_thread_counter; // Each thread will have separate copy
现在,想想 strtok
是如何工作的——想想对 strtok
!
的(并发)调用
谁能简单明了地解释一下 i 和 j 变量的区别?
#include <thread>
using namespace std;
void f(int n)
{
thread_local int i = n;
int j = n;
}
int main()
{
thread t1(f, 1);
thread t2(f, 2);
t1.join();
t2.join();
return 0;
}
static
时,thread_local
表示 static
。
局部 static
变量在多次调用给定函数时保留其值。您可以在其他地方阅读有关 static
变量的信息。
现在,我假设您确实知道 static
变量是什么 - 重要的是:
- 静态变量具有 局部作用域
- (but)静态变量全局存在
第二点使其他函数可以通过 C++ 引用和指针访问静态变量的内存 - 它证明静态变量只有一个副本 - 跨越进程的 所有线程 .您需要知道线程是什么以及如何 create/program 线程。
现在,进入正题。您知道 Global 变量具有全局作用域和全局可访问性,但是当您 运行 程序的两个或多个实例时,其中的 both/all 会有一个单独的副本该全局变量的。这意味着每个 进程 都会有该全局变量的单独副本。
那么,如果您希望每个线程都有一个 static
变量的单独副本怎么办?您使用 thread_static
。每个线程都有该静态变量的单独副本。
有趣的是,您还可以将 thread_local
应用于全局变量 - 因此每个线程也会收到这些全局变量的单独副本!
// Globals
int counter;
thread_local int this_thread_counter; // Each thread will have separate copy
现在,想想 strtok
是如何工作的——想想对 strtok
!