经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
c/c++ 多线程 thread_local 类型
来源:cnblogs  作者:小石王  时间:2018/11/2 9:15:52  对本文有异议

多线程 thread_local 类型

thread_local变量是C++ 11新引入的一种存储类型。

  • thread_local关键字修饰的变量具有线程周期(thread duration),
  • 这些变量(或者说对象)在线程开始的时候被生成(allocated),
  • 在线程结束的时候被销毁(deallocated)。
  • 并且每 一个线程都拥有一个独立的变量实例(Each thread has its own instance of the object)。
  • thread_local 可以和static 与 extern关键字联合使用,这将影响变量的链接属性(to adjust linkage)。

例子:

  1. #include <iostream>
  2. #include <thread>
  3. struct S
  4. {
  5. S() {
  6. printf("S() called i=%d\n", i);
  7. }
  8. int i = 0;
  9. };
  10. //thread_local S gs;
  11. S gs;
  12. void foo()
  13. {
  14. gs.i += 1;
  15. printf("foo %p, %d\n", &gs, gs.i);
  16. }
  17. void bar()
  18. {
  19. gs.i += 2;
  20. printf("bar %p, %d\n", &gs, gs.i);
  21. }
  22. int main()
  23. {
  24. std::thread a(foo), b(bar);
  25. a.join();
  26. b.join();
  27. }

github源代码

执行结果:结构体S只生成了一个对象实例,并且2个线程是共享这个实例的,可以看出实例的内存地址相同

  1. S() called i=0
  2. bar 0x55879165501c, 2
  3. foo 0x55879165501c, 3

如果把:S gs;加上thread_local关键字,

  1. thread_local S gs;

执行结果:结构体S在每个线程中都生成了一个实例,可以看出实例的内存地址不相同。

  1. S() called i=0
  2. bar 0x7f23eb2506f8, 2
  3. S() called i=0
  4. foo 0x7f23eba516f8, 1

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号