C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)

2023-11-13

线程库C++11

在C++ 11引入了对多线程的支持。包括线程、互斥锁、原子操作、自动加减锁和同步。下面就分别介绍一下对应的用法。

线程Thread

线程:系统分配cup时间和调度的基本单位

头文件

#include<thread>

常用的成员函数

函数名 作用
get_id() 获取当前线程ID
join() 等待
detach() 分离

创建线程的方式

thread t1(函数地址);//无参
thread t2(函数地址,参数1,参数2,…);//有参

A a;
thread t3(&A::output,&a);成员函数,

全局函数实例:

#include <thread>
#include <string>
#include <iostream>
using namespace std;
 
void test1(string name)//子线程 有参
{
    for (int i = 0; i < 100; ++i)
    {
        cout << name <<  " test1:" << i << endl;
    }
}
void test2()//子线程
{
    for (int i = 0; i < 100; ++i)
    {
        cout << "test2:" << i << endl;
    }
}
 
 
int main()
{
    thread t1(test1, "线程1");//创建线程 并启动线程
    thread t2(test2);
 
    t1.join();//等待线程执行结束,不写会造成程序崩溃
    t2.join();
    return 0;
}

成员函数实例:

class A
{
public:
    void output(string name)
    {
        cout << "线程执行 " << name << endl;
    }
};
 
int main()
{
    A a;
 
    //格式:thread t1(函数地址 对象地址 参数1 参数2...)
    thread t1(&A::output, &a, "线程一");//成员函数做线程
 
    t1.join();
    return 0;
}


多线程的冲突问题

a. 出现了更高等级的指令
b. 该线程的时间片到了

互斥体Mutex

头文件

#include<mutex>

常用的成员函数

函数名 作用
lock() 加锁
unlock() 解锁

实例

#include <thread>
#include <string>
#include <iostream>
#include <mutex>
using namespace std;
 
int g_a = 0;
mutex g_m;//创建锁
 
void test3()
{
    for (int i = 0; i < 1000000; ++i)
    {
        //保证数据的完整性
        g_m.lock();//加锁
        g_a += 1;
        g_m.unlock();//解锁
    }
}
 
int main()
{
    thread t1(test3);
    thread t2(test3);
    thread t3(test3);
 
    t1.join();
    t2.join();
    t3.join();
    cout << g_a << endl;
    return 0;
}

原子操作Atomic

头文件

#include<atomic>

实例

#include <thread>
#include <iostream>
#include <atomic>
using namespace std;
 
atomic_int a;//将这个变量设置为int原子级别
void test3()
{
    for (int i = 0; i < 1000000; ++i)
    {
        ++a;//在执行过程中,等同于锁
    }
}
 
int main()
{
    thread t1(test3);
    thread t2(test3);
    thread t3(test3);
 
    t1.join();
    t2.join();
    t3.join();
    cout << a << endl;
    return 0;
}


自动加解锁lock_guard

在创建时调用构造函数自动加锁,出了作用域就调用析构函数解锁。

实例

#include <thread>
#include <string>
#include <iostream>
#include <mutex>
#include <atomic>
using namespace std;
 
int a = 0;
mutex g_m;//创建锁
void test3()
{
    for (int i = 0; i < 1000000; ++i)
    {
        lock_guard<mutex> la(g_m);//自动加锁 自动释放
        ++a;
        cout << a << endl;
    }
}
 
int main()
{
    thread t1(test3);
    thread t2(test3);
    thread t3(test3);
 
    t1.join();
    t2.join();
    t3.join();
    cout << a << endl;
    return 0;
}


同步

同步方式

  1. 信号量
  2. 事件
  3. 消息
  4. C++11中的条件变量

实例

#include <thread>
#include <string>
#include <iostream>
#include <mutex>
#include <atomic>
#include <string>
#include <condition_variable>
using namespace std;
 
string  buffer;
mutex m; 
condition_variable cv; //状态变量
//为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起;
void workThread()
{
    //unique_lock比lock_guard灵活很多,效率上差一点,内存占用多一点。
    unique_lock<mutex> lk(m);
    cv.wait(lk);//等待信号
 
    cout << "收到数据:" << buffer << endl;
}
 
int main()
{
    thread t1(workThread);
 
    string name;
    cin >> name;
 
    buffer = name;
    cv.notify_all();//发出通知
 
    t1.join();
    cout << "数据处理完成" << endl;
    return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11之线程库(Thread、Mutex、atomic、lock_guard、同步) 的相关文章

随机推荐

  • 手把手教你区块链java开发智能合约nft(第四篇)-如何动态获取gasPrice和gasLimit?

    手把手教你区块链java开发智能合约nft 第三篇 如何动态获取gasPrice和gasLimit 初学区块链 那真叫一个痛苦并无助 如果没有人带你的话 今天写的这篇是在前面文章基础上写的 初学区块链的朋友建议先看我前面写的文章 手把手教你
  • 【雕爷学编程】Arduino动手做(72)---HX711 人体称重模块

    37款传感器与执行器的提法 在网络上广泛流传 其实Arduino能够兼容的传感器模块肯定是不止这37种的 鉴于本人手头积累了一些传感器和执行器模块 依照实践出真知 一定要动手做 的理念 以学习和交流为目的 这里准备逐一动手尝试系列实验 不管
  • win32读取注册表

    直接代码 bool bIsIE6 false HKEY hKey NULL DWORD dwType DWORD dwSize LONG lReg RegOpenKey HKEY CLASSES ROOT HTTP shell open c
  • 技术方案设计没有深度?试试这套方法论

    原文为阿里技术发布的一篇文章 作者 高福来 不拔 读后受益匪浅 决定转载分享 平时听到一些同学说技术方案没什么深度 很难讲出来 怎么去体现技术方案设计的深度是大家普遍关心的一个问题 这个问题不是个例问题 因此分享下自己的一些观点和看法 主要
  • ps怎么对比原图快捷键_Photoshop最常用的10个快捷键,让你修图事半功倍!

    小伙伴们 小编今天要给大家发一波福利 揭秘Photoshop最常用的10个快捷键 让你修图事半功倍 1 Ctrl Ctrl 放大 缩小图层 使用Photoshop进行修图时 为了更加准确地进行精修 我们需要放大图片 此时使用快捷键 Ctrl
  • STM32F4-正点原子探索者-SYSTEM文件夹下的delay.c文件内延时函数详解

    目录 笔记 首先是对应的头文件delay h中的函数 1 delay init u8 SYSCLK 此处将把关于UCOS相关代码忽略 后面学习 注 以下为SysTick结构体详解 与主体函数只是有一定联系 可略过 SysTick结构体中的C
  • 散点矩阵

    import pandas as pd import matplotlib pyplot as plt import seaborn as sns crime pd read csv crimeRatesByState2005 csv cr
  • 【Unity3D】Unity3D游戏里实现复制粘贴功能

    public class sTest MonoBehaviour public InputField input public Button btn if UNITY IOS DllImport Internal private stati
  • ffmpeg开发环境的安装测试和更新的步骤

    本文将介绍ffmpeg开发环境的安装测试和更新的步骤 基于ubuntu16 04和ffmpeg3 2 1 安装x264 1 libx264需要yasm sudo apt get install yasm 但是yasm版本比较旧 所以安装na
  • 做个成功的管理者

    什么是 管理 大家对这词都不陌生 但什么才是真正的管理呢 管理的真谛在 理 不在 管 管理者的主要职责就是建立一个合理的游戏规则 让每个员工按照游戏规则自我管理 游戏规则要兼顾公司的利益和个人的利益 并且把公司的利益和个人的利益统一起来 尽
  • SQL语法基础

    结构化查询语言 Structured Query Language 是一种特殊目的的编程语言 是一种数据库查询和程序设计语言 用于存取数据以及查询 更新和管理关系数据库系统 数据查询语言 DQL SELECT 查询 数据操作语言 DML I
  • Flink实时任务性能调优

    前言 通常我们在开发完Flink任务提交运行后 需要对任务的参数进行一些调整 通常需要调整的情况是任务消费速度跟不上数据写入速度 从而导致实时任务出现反压 内存GC频繁 FullGC 频繁 内存溢出导致TaskManager被Kill 今天
  • 【Git】(六)子模块跟随主仓库切换分支

    场景 主仓库 TestGit 子模块 SubModule 分支v1 0 gitmodules文件 submodule Library SubModule path Library SubModule url git gitee com su
  • 内置变量列表(Unix)

    当前页可打印的行数 属于Perl格式系统的一部分 根据上下文内容返回错误号或者错误串 列表分隔符 打印数字时默认的数字输出格式 Perl解释器的进程ID 当前输出通道的当前页号 与上个格式匹配的字符串 当前进程的组ID 当前进程的有效组ID
  • 【JS逆向】之JS函数的闭包导出调用

    前言 闭包其实就是一个函数里面的私有方法 我们在函数外部无法调用 这个就叫闭包 理解起来其实也不难 这个其实也跟js的作用域有很大关系的 这里的闭包也用了作用域的特性 js的作用域分两种 全局和局部 基于我们所熟悉的作用域的知识 我们知道在
  • org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

    大部分愿意是因为导入的包的版本问题 我是把jackson的包换成了高版本的就没有报错了
  • 【golang设计模式】Golang设计模式详解二

    六 工厂方法模式 工厂方法模式使用子类的方式延迟生成对象到子类中实现 Go中不存在继承 所以使用匿名组合来实现 代码如下 factorymethod go package factorymethod Operator 是被封装的实际类接口
  • [546]python实现K-Nearest Neighbor算法

    K Nearest Neighbor KNN 可以翻译为K最近邻算法 是机器学习中最简单的分类算法 为了更好的理解这个算法 本帖使用Python实现这个K Nearest Neighbor算法 最后和scikit learn中的k Near
  • 微信无法定位 请打开定位服务器,微信定位是灰色的点不开是怎么回事?该怎么解决问题呢?...

    你知道什么是微信定位吗 你知道微信定位是灰色的点不开是怎么回事 该怎么解决问题呢 最近很多微信用户问我微信定位是灰色的点不开是怎么回事 该怎么解决问题呢 下面小编就带你了解一下微信定位是灰色的点不开是怎么回事 该怎么解决问题呢 小伙伴们如果
  • C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)

    目录 线程库C 11 线程Thread 头文件 常用的成员函数 创建线程的方式 多线程的冲突问题 互斥体Mutex 头文件 常用的成员函数 实例 原子操作Atomic 头文件 实例 自动加解锁lock guard 实例 同步 同步方式 实例