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 !

的(并发)调用