21xrx.com
2024-12-22 21:50:12 Sunday
登录
文章检索 我的文章 写文章
C++线程局部存储(ThreadLocal)
2023-06-25 18:22:30 深夜i     --     --
C++ 线程 局部存储 ThreadLocal

C++线程局部存储(Thread Local Storage,TLS)是一种仅在当前线程内可见的存储方式,它提供了一种方便的方法,在多个线程中共享数据时,确保每个线程都有它自己的本地副本。这使得多线程代码的编写更容易,因为它们不需要控制数据的同步问题。

TLS提供了一种可以在多线程中安全地存储和访问数据的方法。当一个变量被声明为TLS时,它将会被分配一段内存,每个线程将会有自己的一份拷贝,以确保其它线程无法访问到该变量。这样,每个线程都可以在它自己的本地内存中存储和访问数据,而不需要考虑与其它线程共同访问时的同步问题。

在C++11之前,TLS的实现和使用方法都较为复杂,需要使用Windows平台专用API或POSIX线程库的函数。但是,C++11标准里已经提供了 std::thread_local 关键字,使得在C++中使用TLS变得更加方便。

下面是使用thread_local 实现的一个简单的示例:


#include <iostream>

#include <thread>

#include <mutex>

static thread_local std::string thread_name;

void PrintThreadName()

  std::cout << "Thread " << thread_name << " running" << std::endl;

int main() {

  std::thread t1([]{ thread_name = "A"; PrintThreadName(); });

  std::thread t2([]{ thread_name = "B"; PrintThreadName(); });

  t1.join();

  t2.join();

  return 0;

}

这个示例代码定义了一个 thread_local 的 std::string 变量 thread_name,然后在两个不同的线程中初始化它,并输出当前线程的名称。在运行结果中可以看到两个线程分别输出了它们对应的 thread_name 的值 "A" 和 "B"。

总结来说,C++中使用TLS可以很方便地实现线程本地存储,针对每个线程提供了一个独立的存储空间,避免了多个线程之间的竞争和同步问题。这种机制在并发编程中被广泛地使用,提高了程序的性能和可维护性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复