c++ 线程安全与线程管理

C++11引入了标准库中的多线程支持,包括std::thread类和各种同步机制

  • 互斥锁std::mutex : 互斥锁用于保护共享资源,确保同一时间只有一个线程能够访问该资源,以防止数据竞争。

  • 条件变量std::condition_variable : 条件变量用于线程之间的通信,允许一个或多个线程等待某个条件(或者事件)的发生,而另一个线程则可以通知这些等待的线程该条件已经满足。

  • 原子操作std::atomic : 原子操作用于无锁编程,提供对基本数据类型的原子读写操作,防止数据竞争而无需显式的锁机制。

  • 信号量(Semaphore):用于控制对共享资源的访问,可以实现多个线程之间的同步和互斥。

  • 读写锁(Reader-Writer Lock):用于实现读写线程对共享数据的访问控制,允许多个读线程同时进行读操作,但只允许一个写线程进行写操作。

  • 屏障(Barrier):用于保证多个线程在某个点上同步,只有当所有线程都达到屏障点时才能继续执行。

  • 事件(Event):用于实现线程间的通信和同步,一个线程等待某个事件的发生,而另一个线程触发该事件。

  • 互斥量递归锁(Recursive Mutex):与互斥锁类似,但允许同一个线程多次获得同一个锁,避免死锁。

  • 读写互斥量(Read-Write Mutex):类似于读写锁,但使用互斥量来实现,可以更灵活地控制读写线程对共享数据的访问。

创建和管理线程

#include <iostream>
#include <thread>

void printMessage(const std::string& message) {
    std::cout << message << std::endl;
}

int main() {
    std::thread t1(printMessage, "Hello from thread 1");
    std::thread t2(printMessage, "Hello from thread 2");

    // 等待线程结束
    t1.join();
    t2.join();

    return 0;
}

使用互斥锁进行同步

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;

void printMessage(const std::string& message) {
    std::lock_guard<std::mutex> lock(mtx);
    std::cout << message << std::endl;
}

int main() {
    std::thread t1(printMessage, "Hello from thread 1");
    std::thread t2(printMessage, "Hello from thread 2");

    t1.join();
    t2.join();

    return 0;
}

使用条件变量进行线程间通信

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void printMessage() {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, []{ return ready; });
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    std::thread t(printMessage);

    {
        std::lock_guard<std::mutex> lock(mtx);
        ready = true;
    }
    cv.notify_one();

    t.join();

    return 0;
}

信号量(Semaphore):

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
#include <semaphore.h>

sem_t semaphore;

void worker() {
    sem_wait(&semaphore); // 等待信号量
    std::cout << "执行任务" << std::endl;
}

int main() {
    sem_init(&semaphore, 0, 0); // 初始化信号量为0
    std::thread t(worker);
    // 模拟一些操作
    std::this_thread::sleep_for(std::chrono::seconds(2));
    sem_post(&semaphore); // 发送信号量
    t.join();
    sem_destroy(&semaphore);
    return 0;
}

读写锁(Reader-Writer Lock):

#include

#include <thread>
#include <shared_mutex>

std::shared_mutex rwMutex;
int data = 0;

void reader() {
    std::shared_lock<std::shared_mutex> lock(rwMutex);
    std::cout << "读取数据:" << data << std::endl;
}

void writer() {
    std::unique_lock<std::shared_mutex> lock(rwMutex);
    data++;
    std::cout << "写入数据:" << data << std::endl;
}

int main() {
    std::thread readerThread1(reader);
    std::thread readerThread2(reader);
    std::thread writerThread(writer);

    readerThread1.join();
    readerThread2.join();
    writerThread.join();

    return 0;
}

屏障(Barrier):

#include <iostream>
#include <thread>
#include <barrier>

std::barrier myBarrier(3); // 创建一个屏障,需要三个线程都到达后才能继续执行

void worker() {
    // 模拟一些操作
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "执行任务" << std::endl;
    myBarrier.arrive_and_wait(); // 到达屏障并等待
    std::cout << "任务完成" << std::endl;
}

int main() {
    std::thread t1(worker);
    std::thread t2(worker);
    std::thread t3(worker);

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

    return 0;
}

事件(Event)

事件可以用于实现线程间的通信和同步,一个线程等待某个事件的发生,而另一个线程触发该事件。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;
bool eventOccurred = false;

void waitForEvent() {
    std::unique_lock<std::mutex> lock(mtx);
    while (!eventOccurred) {
        cv.wait(lock);
    }
    std::cout << "事件已发生,执行任务" << std::endl;
}

void triggerEvent() {
    {
        std::lock_guard<std::mutex> lock(mtx);
        eventOccurred = true;
    }
    cv.notify_one();
    std::cout << "事件已触发" << std::endl;
}

int main() {
    std::thread t1(waitForEvent);
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::thread t2(triggerEvent);

    t1.join();
    t2.join();

    return 0;
}

互斥量递归锁(Recursive Mutex)

互斥量递归锁允许同一个线程多次获得同一个锁,避免了死锁。

#include <iostream>
#include <thread>
#include <mutex>

std::recursive_mutex mtx;

void recursiveFunction(int depth) {
    std::lock_guard<std::recursive_mutex> lock(mtx);
    if (depth > 0) {
        std::cout << "递归深度:" << depth << std::endl;
        recursiveFunction(depth - 1);
    }
}

int main() {
    recursiveFunction(3);

    return 0;
}

读写互斥量(Read-Write Mutex)

读写互斥量使用互斥量来实现,可以更灵活地控制读写线程对共享数据的访问。

#include <iostream>
#include <thread>
#include <mutex>

std::mutex readMutex;
std::mutex writeMutex;
int data = 0;

void reader() {
    std::lock_guard<std::mutex> lock(readMutex);
    std::cout << "读取数据:" << data << std::endl;
}

void writer() {
    std::lock_guard<std::mutex> lock(writeMutex);
    data++;
    std::cout << "写入数据:" << data << std::endl;
}

int main() {
    std::thread readerThread1(reader);
    std::thread readerThread2(reader);
    std::thread writerThread(writer);

    readerThread1.join();
    readerThread2.join();
    writerThread.join();

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/746023.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMamba: Visual State Space Model论文笔记

文章目录 VMamba: Visual State Space Model摘要引言相关工作Preliminaries方法网络结构2D-Selective-Scan for Vision Data(SS2D) VMamba: Visual State Space Model 论文地址: https://arxiv.org/abs/2401.10166 代码地址: https://github.com/MzeroMiko/VMamba 摘要 卷积神…

【Docker】安装和加速

目录 1.安装 2.了解 docker 信息 3.查询状态 4. 重新启动Docker 1.安装 yum install –y docker 2.了解 docker 信息 cat /etc/redhat-release 3.查询状态 systemctl status docker 4.支持 1.12 的 docker 镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docke…

深入了解 msvcr120.dll问题解决指南,msvcr120.dll在电脑中的重要性

在Windows操作系统中&#xff0c;.dll 文件扮演了非常重要的角色&#xff0c;它们包含许多程序运行所需的代码和数据。其中 msvcr120.dll 是一个常见的动态链接库文件&#xff0c;是 Microsoft Visual C Redistributable Packages 的一部分。这篇文章将探讨 msvcr120.dll 的功能…

生命在于学习——Python人工智能原理(4.4)

三、Python的数据类型 3.2 Python的组合数据类型 特点&#xff1a;表示多个元素的组合&#xff0c;可以包含不同类型的元素&#xff0c;甚至是其他的组合数据类型。 在内存中通常需要额外的空间来存储元素间的关系。 组合数据类型能够将多个同类型或不同类型的数据组织起来&a…

python turtle 004Hello Kity

代码&#xff1a;pythonturtle004HelloKity资源-CSDN文库 # 作者V w1933423 import math import turtle as t# 设置画笔速度 t.speed(0)# 定义函数画弧 def myarc(t1, r, angle):arc_length 2 * math.pi * r * angle / 360 # 弧长n int(arc_length / 3) 1 # 分割段数step…

新手选择代理IP时这几点误区一定要避开!

在选择代理IP时&#xff0c;许多用户可能会因为对代理IP的认识不足或受到一些误导&#xff0c;而陷入一些常见的误区。这些误区不仅可能导致用户无法达到预期的效果&#xff0c;还可能带来一些不必要的风险。下面&#xff0c;IPIDEA代理IP就与大家一同分析在选择代理IP时需要避…

【Qt+opencv】编译、配置opencv

文章目录 前言下载opencv编译opencvmingw版本 总结 前言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;它包含了超过2500个优化的算法。这些算法可以用来检测和识别面部&#xff0c;识别对象&#x…

初识es(elasticsearch)

初识elasticsearch 什么是elasticsearch&#xff1f;&#xff1a; 一个开源的分部署搜索引擎、可以用来实现搜索、日志统计、分析、系统监控等功能。 什么是文档和词条&#xff1f; 每一条数据就是一个文档对文档中的内容进行分词&#xff0c;得到的词语就是词条 什么是正向…

小型海外仓布局策略:高效利用有限空间,标准化3F流程

合理高效的仓库空间设计&#xff0c;不只是对大型海外仓很关键。对空间有限的小型海外仓来说或许价值更大。 本身仓储空间就有限&#xff0c;如果还没有科学规划&#xff0c;造成空间浪费&#xff0c;那将直接影响到核心业务的运转。 今天我们就给大家整理了对小型海外仓布局…

海外短剧系统:一扇窥探多元文化的奇妙之窗

随着全球化的推进&#xff0c;文化交流的壁垒逐渐消融&#xff0c;我们得以更加便捷地领略到世界各地的独特风情。在这一背景下&#xff0c;海外短剧系统应运而生&#xff0c;它如同一扇扇虚拟的窗户&#xff0c;将我们带入不同国家、不同民族、不同文化的世界&#xff0c;让我…

24年了 直播带货的未来如何?

32 个国家在取消电商&#xff0c; 那我国的电商呢&#xff0c;首先电商是不会被取缔的。直播电商会被严格的控制&#xff0c;比如有一家饼店&#xff0c;它线下的销售是 3000 万&#xff0c;线上抖音的销售是 5, 000 万。 这一类型小而精又专业的品牌企业&#xff0c;未来在抖…

【微前端-Single-SPA、qiankun的基本原理和使用】

背景 在实际项目中&#xff0c;随着日常跌倒导致的必然墒增&#xff0c;项目会越来越冗余不好维护&#xff0c;而且有时候一个项目会使用的其他团队的功能&#xff0c;这种跨团队不好维护和管理等等问题&#xff0c;所以基于解决这些问题&#xff0c;出现了微前端的解决方案。…

实战案例:如何用ChatGPT生成适合不同领域的高质量文章

随着人工智能技术的飞速发展&#xff0c;生成高质量文章已经不再是难题。特别是OpenAI开发的ChatGPT&#xff0c;更是为写作工作带来了极大的便利。那么&#xff0c;如何用ChatGPT生成适合不同领域的高质量文章呢&#xff1f;本文将通过实战案例&#xff0c;为大家详细讲解这一…

react学习——15react生命周期(新)

一、生命周期图新 二、生命周期三个阶段&#xff08;新&#xff09; 1. 初始化阶段&#xff1a;由ReactDOM.render()触发—初次渲染 1. constructor() 2. getDerivedStateFromProps 3. render() 4. componentDidMount()2. 更新阶段&#xff1a;由组件内部this.setSate()或…

Sensei for Mac:一键清理,系统如新!

Sensei for Mac是一款高效且易于使用的系统优化清理工具。它能够深入Mac系统内部&#xff0c;智能识别并清理无用的缓存文件、临时文件、垃圾邮件等&#xff0c;从而释放磁盘空间&#xff0c;提升系统性能。无论是日常使用还是长时间工作后&#xff0c;Sensei都能帮助你的Mac恢…

Vue_cli搭建过程项目创建

概述 vue-cli 官方提供的一个脚手架&#xff0c;用于快速生成一个 vue 的项目模板&#xff1b;预先定义 好的目录结构及基础代码&#xff0c;就好比咱们在创建 Maven 项目时可以选择创建一个 骨架项目&#xff0c;这个骨架项目就是脚手架&#xff0c;我们的开发更加的快速&am…

台灯学生用哪个牌子最好?五款学生专用台灯大全分享

随着科技的持续进步&#xff0c;电子产品无疑为我们的生活带来了极大的便利&#xff0c;同时也暗藏了不少隐患。其中最令广大家长忧心的便是孩子视力的健康&#xff0c;他们从小就面临着手机和电视等屏幕对孩子视力的潜在威胁。为了应对这一问题&#xff0c;家长们不遗余力地寻…

RT-Thread Studio实现静态线程

1创建项目 &#xff08;STM32F03ZET6&#xff09; RT-Thread项目与RT-Thread Nano 项目区别 RT-Thread: 完整版&#xff1a;这是RT-Thread的完整形态&#xff0c;适用于资源较丰富的物联网设备。功能&#xff1a;它提供了全面的中间件组件&#xff0c;如文件系统、网络协议栈、…

【网络安全学习】漏洞利用:-01- BurpSuite的基础设置使用

Burp Suite是一款集成了多种功能的Web应用渗透测试工具&#xff0c;可以帮助渗透测试人员对Web应用进行拦截、分析、修改、重放、扫描、爆破、模糊测试等操作&#xff0c;从而发现和利用Web应用中的漏洞。可以说Burp Suite是每个安全从业人员必须学会使用的安全渗透测试工具。 …

RedHat9 | RAID配置与管理

一、实验环境 1、RAID简介 RAID&#xff08;Redundant Array of Independent Disks&#xff09;&#xff0c;即独立磁盘冗余阵列&#xff0c;是一种数据存储技术。它通过将多个独立的磁盘驱动器组合起来&#xff0c;形成一个逻辑上的整体&#xff0c;从而提高数据存储的性能、…