c++11 中添加了新的关键字thread_local,用来声明新的存储期(线程存储期变量),即线程局部变量。

程序中的所有对象拥有下列存储期:

1 自动存储期 对象的存储在外围代码块开始时分配,而在结束时解分配。除了声明为 static 、 extern 或 thread_local 的所有局部对象拥有此存储期。

2 静态存储期 对象的存储在程序开始时分配,而在程序结束时解分配。只存在对象的一个实例。所有声明于命名空间作用域(包含全局命名空间)的对象,加上声明带有 static 或 extern 的对象拥有此存储期。

3 线程存储期 对象的存储在线程开始时分配,而在线程结束时解分配。每个线程拥有其自身的对象实例。唯有声明为 thread_local 的对象拥有此存储期。 thread_local 能与 static 或 extern 一同出现,以调整链接。

4 (C++11 起)动态存储期 通过使用动态内存分配函数,由请求分配和解分配对象的存储。

什么是thread_local,关于thread_localthread_specific_ptr代表了一个全局的变量,而在每个线程中都各自new一个线程本地的对象交给它进行管理,这样,各个线程就可以各自独立地访问这个全局变量的本地存储版本,线程之间就不会因为访问同一全局对象而引起资源竞争导致性能下降。而线程结束时,这个资源会被自动释放。 C++11的thread_local来自于boost thread_specific_ptr

#include <iostream>
#include <string>
#include <thread>
#include <mutex>thread_local unsigned int rage = 1;
std::mutex cout_mutex;void increase_rage(const std::string& thread_name)
{++rage; // 在锁外修改 OK ;这是线程局域变量std::lock_guard<std::mutex> lock(cout_mutex);std::cout << "Rage counter for " << thread_name << ": " << rage << '\n';
}int main()
{std::thread a(increase_rage, "a"), b(increase_rage, "b");{std::lock_guard<std::mutex> lock(cout_mutex);std::cout << "Rage counter for main: " << rage << '\n';}a.join();b.join();
}

输出为:

/*
Rage counter for a: 2
Rage counter for main: 1
Rage counter for b: 2
*/

我们可以看到,声明为线程存储期的变量,每个线程之间互不影响,通俗的讲我们可以认为每个线程拥有此变量的一个副本,每个线程之前互不影响,其底层的原理Linux中的线程局部存储等提供的api接口。

#include <pthread.h>// Returns 0 on success, or a positive error number on error
int pthread_key_create (pthread_key_t *key, void (*destructor)(void *));// Returns 0 on success, or a positive error number on error
int pthread_key_delete (pthread_key_t key);// Returns 0 on success, or a positive error number on error
int pthread_setspecific (pthread_key_t key, const void *value);// Returns pointer, or NULL if no thread-specific data is associated with key
void *pthread_getspecific (pthread_key_t key);

C++11 thread_local相关推荐

  1. C++多线程:thread_local

    概念 首先thread_local是一个关键词,thread_local是C++ 11新引入的一种存储期指定符.它会影响变量的存储周期(Storage duration),与它同是存储期指定符的还有以 ...

  2. C11头文件threads.h声明了创建和管理线程,信号,条件变量的函数

    作者Danny Kalev 是通过以色列系统分析师协会认证的系统分析师, 并且是专攻C++的软件工程师. Kalev 写了多本C++的书籍,同时给不同的软件开发者站点投搞C++文章. 他是C++标准委 ...

  3. 使用Clang作为编译器 —— Clang 语言扩展

    1. 介绍 本文档描述了 Clang 提供的语言扩展.除了这里列出的语言扩展之外,Clang 还旨在支持广泛的 GCC 扩展.有关这些扩展的更多信息,请参阅 GCC手册. 2. 特性检查宏 语言扩展可 ...

  4. C++11中thread_local的使用

    C++11中的thread_local是C++存储期的一种,属于线程存储期.存储期定义C++程序中变量/函数的范围(可见性)和生命周期.C++程序中可用的存储期包括auto.register.stat ...

  5. 【C++】C++11新增关键字详解

    目录 一.auto 1.auto 用来声明自动变量,表明变量存储在栈(C++11之前) 2.auto用于推断变量类型示例(C++11) 3.声明或定义函数时作为函数返回值的占位符,此时需要与关键字 d ...

  6. C++11 (多线程)并发编程总结

    | 线程 std::thread 创建std::thread,一般会绑定一个底层的线程.若该thread还绑定好函数对象,则即刻将该函数运行于thread的底层线程. 线程相关的很多默认是move语义 ...

  7. C++11中值得关注的几大变化

    赖勇浩(http://laiyonghao.com) 声明:本文源自 Danny Kalev 在 2011 年 6 月 21 日发表的<The Biggest Changes in C++11( ...

  8. C++11 中值得关注的几大变化

    2019独角兽企业重金招聘Python工程师标准>>> 源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and ...

  9. [C++11 std::thread] 使用C++11 编写 Linux 多线程程序

    From: http://www.ibm.com/developerworks/cn/linux/1412_zhupx_thread/index.html 本文讲述了如何使用 C++11 编写 Lin ...

  10. Linux多线程实践(10) --使用 C++11 编写 Linux 多线程程序

    在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程序,从 ...

最新文章

  1. 数据库系统概论:第九章 关系查询和关系优化
  2. 《DSP using MATLAB》Problem 6.12
  3. 如何学好初中计算机,初中生怎么学习方法好 十大方法告诉你
  4. 【转】【C#.NET】ASP.NET状态管理之一:Cookie
  5. 用数据告诉你,新型冠状病毒传染性有多强?
  6. g2是一种编程语言吗_我写了一种编程语言。 这也是您可以的方式。
  7. 体绘制的原理和Raycasting的实现
  8. 搞怪又可爱!一组emoji表情
  9. 使用Python获取Excel文件中单元格公式的计算结果
  10. HTML5画布(矩形)
  11. 剖析 ADO.NET 批处理更新
  12. 地外水平/斜面的太阳理论辐照度计算及其python实现
  13. matlab信源编码,常见无失真信源编码算法及Matlab实现比较(27页)-原创力文档
  14. 智能家居系统的总线系统和无线系统的具体介绍
  15. cuda 原子锁多线程操作通用原子操作
  16. 【数学模型】基于Volterra理论的捕食模型
  17. html动态工艺流程,化工工艺动态流程图制作软件
  18. 磁滞回线magnetic hysteresis loop
  19. Aseprite学习/技巧
  20. vue的组件/data的参数/组件传值/插槽/侦听器/生命周期钩子函数

热门文章

  1. 聊聊kafka consumer offset lag的监控
  2. mysql如何给一个数据库所有表都增加一个字段?
  3. EXCHANGE RBAC(基于角色的访问控制)管理工具
  4. WEB网页专业词汇 汇总
  5. shell,expect主机密钥免密码登录分发
  6. OLEDB SqlHelper
  7. 23.PHP的哈希表实现
  8. 28. JavaScript 库
  9. 问题:jquery中的change()事件,以及jquery中的prop()事件与attr()事件的区别
  10. 从CUBIC/BBR的TCP ACK失速说起