gpt4 book ai didi

C++11thread_local关键字

转载 作者:我是一只小鸟 更新时间:2023-03-08 06:31:26 27 4
gpt4 key购买 nike

这是一篇科普文--关于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 这个变量修饰, 用于解决线程没有自己全局变量的问题 .

                        
                          #include <iostream>
#include <thread>

thread_local int i = 0;

int func(int val)
{
        i = val;
        i = i + 2;
        std::cout<<i;
}

int func2()
{
        std::cout<<i;
}

int main()
{
        i = 9;
        std::thread t1(func, 1);
        std::thread t2(func, 2);
        std::thread t3(func, 3);
        std::thread t4(func2);

        t1.join();
        t2.join();
        t3.join();
        t4.join();

        std::cout<<i<<std::endl;
        return 0;
}

                        
                      

运行结果:

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

最后此篇关于C++11thread_local关键字的文章就讲到这里了,如果你想了解更多关于C++11thread_local关键字的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com