求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
要资料
 
追随技术信仰

随时听讲座
每天看新闻
 
 
C++并发编程(中文版)
前言
第1章 你好,C++的并发世界!
1.1 何谓并发
1.2 为什么使用并发?
1.3 C++中的并发和多线程
1.4 开始入门
1.5 本章总结
第2章 线程管理
2.1 线程管理的基础
2.2 向线程函数传递参数
2.3 转移线程所有权
2.4 运行时决定线程数量
2.5 识别线程
2.6 本章总结
第3章 线程间共享数据
3.1 共享数据带来的问题
3.2 使用互斥量保护共享数据
3.3 保护共享数据的替代设施
3.4 本章总结
第4章 同步并发操作
4.1 等待一个事件或其他条件
4.2 使用期望等待一次性事件
4.3 限定等待时间
4.4 使用同步操作简化代码
4.5 本章总结
第5章 C++内存模型和原子类型操作
5.1 内存模型基础
5.2 C++中的原子操作和原子类型
5.3 同步操作和强制排序
5.4 本章总结
第6章 基于锁的并发数据结构设计
6.1 为并发设计的意义何在?
6.2 基于锁的并发数据结构
6.3 基于锁设计更加复杂的数据结构
6.4 本章总结
第7章 无锁并发数据结构设计
7.1 定义和意义
7.2 无锁数据结构的例子
7.3 对于设计无锁数据结构的指导建议
7.4 本章总结
第8章 并发代码设计
8.1 线程间划分工作的技术
8.2 影响并发代码性能的因素
8.3 为多线程性能设计数据结构
8.4 设计并发代码的注意事项
8.5 在实践中设计并发代码
8.6 本章总结
第9章 高级线程管理
9.1 线程池
9.2 中断线程
9.3 本章总结
第10章 多线程程序的测试和调试
10.1 与并发相关的错误类型
10.2 定位并发错误的技术
10.3 本章总结
第11章 C++11语言特性简明参考(部分)
11.1 右值引用
11.2 删除函数
11.3 默认函数
11.4 常量表达式函数
11.5 Lambda函数
11.6 变参模板
11.7 自动推导变量类型
11.8 线程本地变量
 

 
目录
线程本地变量
作者:Anthony Williams  译者:陈晓伟
26 次浏览
4次  

A.8 线程本地变量

线程本地变量允许程序中的每个线程都有一个独立的实例拷贝。可以使用thread_local关键字来对这样的变量进行声明。命名空间内的变量,静态成员变量,以及本地变量都可以声明成线程本地变量,为了在线程运行前对这些数据进行存储操作:

  1. thread_local int x; // 命名空间内的线程本地变量
  2. class X
  3. {
  4. static thread_local std::string s; // 线程本地的静态成员变量
  5. };
  6. static thread_local std::string X::s; // 这里需要添加X::s
  7. void foo()
  8. {
  9. thread_local std::vector<int> v; // 一般线程本地变量
  10. }

由命名空间或静态数据成员构成的线程本地变量,需要在线程单元对其进行使用前进行构建。有些实现中,会将对线程本地变量的初始化过程,放在线程中去做;还有一些可能会在其他时间点做初始化,在一些有依赖的组合中,根据具体情况来进行决定。将没有构造好的线程本地变量传递给线程单元使用,不能保证它们会在线程中进行构造。这样就可以动态加载带有线程本地变量的模块——变量首先需要在一个给定的线程中进行构造,之后其他线程就可以通过动态加载模块对线程本地变量进行引用。

函数中声明的线程本地变量,需要使用一个给定线程进行初始化(通过第一波控制流将这些声明传递给指定线程)。如果函数没有被指定线程调用,那么这个函数中声明的线程本地变量就不会构造。本地静态变量也是同样的情况,除非其单独的应用于每一个线程。

静态变量与线程本地变量会共享一些属性——它们可以做进一步的初始化(比如,动态初始化);如果在构造线程本地变量时抛出异常,srd::terminate()就会将程序终止。

析构函数会在构造线程本地变量的那个线程返回时调用,析构顺序是构造的逆顺序。当初始化顺序没有指定时,确定析构函数和这些变量是否有相互依存关系就尤为重要了。当线程本地变量的析构函数抛出异常时,std::terminate()会被调用,将程序终止。

当线程调用std::exit()或从main()函数返回(等价于调用std::exit()作为main()的“返回值”)时,线程本地变量也会为了这个线程进行销毁。应用退出时还有线程在运行,对于这些线程来说,线程本地变量的析构函数就没有被调用。

虽然,线程本地变量在不同线程上有不同的地址,不过还是可以获取指向这些变量的一般指针。指针会在线程中,通过获取地址的方式,引用相应的对象。当引用被销毁的对象时,会出现未定义行为,所以在向其他线程传递线程本地变量指针时,就需要保证指向对象所在的线程结束后,不能对相应的指针进行解引用。

 


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



26 次浏览
4次
下一页