首页 > 编程语言 >C++11 thread_local关键字

C++11 thread_local关键字

时间:2023-03-07 23:44:07浏览次数:63  
标签:11 变量 thread C++ 线程 local

这是一篇科普文--关于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;
}

运行结果:
image

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

标签:11,变量,thread,C++,线程,local
From: https://www.cnblogs.com/whiteBear/p/17190241.html

相关文章

  • ChIP-seq 分析:基因集富集(11)
    动动发财的小手,点个赞吧!1.基因集检测转录因子或表观遗传标记可能作用于按共同生物学特征(共享生物学功能、RNAseq实验中的共同调控等)分组的特定基因组。ChIPseq分析中......
  • PAT 甲级 1011 World Cup Betting(20)
    Withthe2010FIFAWorldCuprunning,footballfanstheworldoverwerebecomingincreasinglyexcitedasthebestplayersfromthebestteamsdoingbattlesfor......
  • 「解题报告」CF1178B WOW Factor
    ¿题目链接这是一道非常富有启发性的题目,值得一做,闪耀着人类和机器人的智慧光辉的绝佳题目.首先注意到(vv)o(vv)的结构,可以考虑枚举中间的o,这样只需要算两边的选法......
  • C# Thread开启线程的几种方式
    C#Thread开启线程的几种方式2023-01-2308:20·opendotnet概述无论学习那门编程语言,多线程都是逃不掉的一个坎。为了提升程序整体的运行效率,我们一般都会把比较耗时......
  • 没等到Windows 11 Moment 2更新?可直接下载更新包升级
    没等到Windows11Moment2更新?可直接下载更新包升级2023-03-0102:50·cnBetaWindows11KB5022913正在作为运行22H2的PC上的可选更新推出。它是备受期待的"Moment2"版......
  • WIN11无法访问win7的共享打印机,(操作不能完成(错误0x00000709)),WIN10能正常访问该共享打
    1、问题描述:WIN11无法访问win7的共享打印机(操作不能完成(错误0x00000709)),win10可以访问。三台电脑都在同一个局域网内,分别为win7,win10,win11。WIN7系统为旗舰版,作为共......
  • C# 多线程(Thread和Task)
    C#多线程(Thread和Task)线程(Thread)是进程中的基本执行单元,是操作系统分配CPU时间的基本单位,一个进程可以包含若干个线程,在进程入口执行的第一个线程被视为这个进......
  • 116、tail+grep命令——2023年3月7日10:01:06
    2023年2月20日14:50:371、tail基本命令tail命令.因为查看日志通常从后面最新的日志去看,tail命令就是从后往前找.比如下述命令会显示access.log的最后10行的内......
  • 删除win11右键一级菜单的AMD驱动栏
    1、按Win+R快捷键,输入"regedit”打开注册表。2、地址栏输入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellExtensions回车。3、点击选择Sh......
  • L11_买东西询问是否有某个东西
    概述在日语中,买东西是想问店里有没有某个东西,可以采用:物品名称はありますか的句式。おまもりはありますか有护身符吗?动画会话A:このTシャツ見て......