经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++11 thread_local关键字
来源:cnblogs  作者:牛犁heart  时间:2023/3/8 11:00:20  对本文有异议

这是一篇科普文--关于thread_local关键字

首先,C++11之前并没有对并发进行任何的支持,C++11首次提供了以下的支持:

  • 语言核心定义了一个内存模型,保证当更改"被两个不同线程使用"的两个object时,他们彼此独立,而引用thread_local关键字
  • 标准库支持启动多线程,包括传递参数、返回数值、跨线程边界传递异常、同步化等,使得控制流程和数据访问同步成为可能。

本节仅对thread_local进行学习


------不华丽的分割线------


抛个砖

如果一个线程挂起或两个线程试图同时访问同一项数据,结果将如何?

引个玉

为了解决并行性问题,C++定义了一个支持线程化执行的内存模型,添加了关键字thread_local,提供了相关的库支持。
关键字thread_local将变量声明为静态存储,其持续性与特定线程相关:即定义这种变量的线程过期时,变量也将过期。

使用举例:
例子来源C++11&14 Thread_local
C++11中就提出了thread_local这个变量修饰,用于解决线程没有自己全局变量的问题

  1. #include <iostream>
  2. #include <thread>
  3. thread_local int i = 0;
  4. int func(int val)
  5. {
  6. i = val;
  7. i = i + 2;
  8. std::cout<<i;
  9. }
  10. int func2()
  11. {
  12. std::cout<<i;
  13. }
  14. int main()
  15. {
  16. i = 9;
  17. std::thread t1(func, 1);
  18. std::thread t2(func, 2);
  19. std::thread t3(func, 3);
  20. std::thread t4(func2);
  21. t1.join();
  22. t2.join();
  23. t3.join();
  24. t4.join();
  25. std::cout<<i<<std::endl;
  26. return 0;
  27. }

运行结果:
image

使用thread_local修饰符在全局声明了一个i变量,i变量将被每个新建线程拷贝作为其域内全局变量
线程1中的i变量和main中的i变量指向不同的地址
thread_local修饰后仍然是一个变量,依旧能够使用取地址操作或通过引用的方法传递给其他线程

原文链接:https://www.cnblogs.com/whiteBear/p/17190241.html

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

本站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号