C++11 std::thread

std::thread

std::thread是一个用于创建和管理线程的类。它可以让程序在多个并发执行的线程中执行不同的任务。下面是std::thread的一些常用用法介绍:

创建线程:

void myFunction(int arg1, double arg2) {// 线程执行的代码
}
std::thread t(myFunction, 42, 3.14);

启动线程:

t.join();  //等待线程执行完毕

使用join()函数等待线程t执行完毕。

t.detach();  //分离线程 

使用detach()函数将线程t从当前线程中分离,使其独立执行。

lock

与std::thread配合使用的两个常用互斥量(mutex)封装类是std::lock_guard和std::unique_lock。它们提供了一种方便的方式来保护共享资源,避免数据竞争。

std::lock_guard
std::lock_guard:是一个简单的RAII(资源获取即初始化)封装类,用于自动化互斥量的加锁和解锁。当std::lock_guard对象的生命周期结束时,会自动释放互斥量。

std::mutex mtx;void myFunction() {std::lock_guard<std::mutex> lock(mtx);// 对共享资源进行操作
}

其特点有:

1.自动加锁和解锁:std::lock_guard的主要目的是在其生命周期内自动加锁互斥量,并在生命周期结束时自动解锁互斥量。这种自动化的机制可以确保无论线程的执行路径如何,互斥量都会被正确地释放,从而避免了忘记解锁的错误。
2.RAII原则:std::lock_guard是一个基于RAII(资源获取即初始化)的封装类。它利用构造函数在创建对象时加锁互斥量,在析构函数中自动解锁互斥量。这种设计模式使得使用std::lock_guard更加方便和安全,因为无论代码流程如何,都能保证互斥量的正确加锁和解锁。
3.作用域限定:std::lock_guard的生命周期受限于其定义的作用域。这意味着它只在其所在的作用域范围内有效,一旦超出该范围,std::lock_guard会自动析构并解锁互斥量。这样可以避免在不需要保护共享资源时持有互斥量的开销和潜在的死锁情况。
4.不可拷贝和移动:std::lock_guard不可拷贝和移动,这是因为它的构造函数是对互斥量进行加锁操作,析构函数是对互斥量进行解锁操作。如果std::lock_guard可以被拷贝或移动,那么在复制或移动时可能导致两个对象同时持有同一个互斥量,从而破坏互斥量的语义和可靠性。因此,std::lock_guard只能通过传值方式在函数调用中传递。

std::unique_lock
std::unique_lock:是一个更灵活的互斥量封装类,与std::lock_guard相比,它提供了更多的功能,如延迟加锁、条件变量的支持等。

std::mutex mtx;void myFunction() {std::unique_lock<std::mutex> lock(mtx);// 对共享资源进行操作
}

unique_lock还可以通过std::adopt_lock参数,接管已经加锁的互斥量,这对于需要多次加解锁的情况很有用。

std::mutex mtx;
mtx.lock();void myFunction() {std::unique_lock<std::mutex> lock(mtx, std::adopt_lock);// 对共享资源进行操作
}

其特点有:

1.延迟加锁和手动解锁:std::unique_lock允许在需要时延迟加锁互斥量,以及在需要时手动解锁互斥量。这使得可以根据需要对互斥量进行更细粒度的控制。例如,可以先锁定互斥量,但稍后再解锁,或者只在某些条件满足时才加锁。
2.条件变量支持:std::unique_lock提供了与条件变量(std::condition_variable)协同工作的支持。它可以在等待条件变量时自动释放互斥量,并在条件满足后重新获取互斥量。这样可以避免无效的忙等待,提高线程的效率。
3.灵活的构造和析构:std::unique_lock的构造函数可以接受一个互斥量对象和一些可选的参数,用于指定不同的锁定策略。例如,可以选择使用std::defer_lock参数来延迟加锁,或者使用std::adopt_lock参数来接管已经加锁的互斥量。同时,std::unique_lock的析构函数会自动解锁互斥量,确保互斥量在适当的时候被解锁。
4.可移动性:std::unique_lock是可移动的,可以通过std::move进行移动语义的操作。这使得可以方便地将std::unique_lock对象传递给其他函数或线程,而不需要进行额外的拷贝操作。
5.更大的灵活性:由于std::unique_lock提供了更多的功能和选项,因此它比std::lock_guard更灵活。它适用于更复杂的情况,如需要多次加解锁、需要等待条件变量或需要与其他线程进行交互等。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3全家桶 - VueRouter - 【2】重定向路由

重定向路由 在路由规则数组中&#xff0c;可采用 redirect 来重定向到另一个地址&#xff1a; 通常是将 / 重定向到 某个页面&#xff1b; 示例展示&#xff1a; router/index.js&#xff1a;import { createRouter, createWebHashHistory, createWebHistory } from vue-route…

混合测试写一写

题目 服务器IP地址规划&#xff1a;client&#xff1a;12.0.0.12/24&#xff0c;网关服务器&#xff1a;ens36:12.0.0.1/24、ens33&#xff1a;192.168.44.1/24&#xff0c;Web1&#xff1a;192.168.44.30/24&#xff0c;Web2&#xff1a;192.168.44.50/24&#xff0c;Nginx&am…

ocr关键信心提取数据集

doc/doc_ch/dataset/kie_datasets.md PaddlePaddle/PaddleOCR - Gitee.com https://huggingface.co/datasets/howard-hou/OCR-VQA OCR-VQA Dataset | Papers With Code

iOS应用内的沙盒目录

iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件&#xff0c;在开发中常常需要数据存储的功能&#xff0c;比如存取文件&#xff0c;归档解档等&#xff0c;因此有必要熟悉沙盒目录及其作用。 Documents目录 开发者可以将应用程序的数据文件保存在这个目录下.…

bzm - Concurrency Thread Group 阶梯式压测

bzm - Concurrency Thread Group 不是JMeter的官方插件&#xff0c;而是一种由Blazemeter提供的高级线程组插件&#xff0c;它提供了更灵活的并发性能测试设置。它可以在不同的时间内并发执行不同数量的线程&#xff0c;模拟不同的负载场景 插件下载地址&#xff1a;Download …

加速 Webpack 构建:提升效率的秘诀

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

作为开发程序员节约时间--提醒自己

对于需求 1.接到新需求,尽量做到不评审不介入,杜绝一句话需求,对于复杂需求一定要要用自己的话复述一遍给产品并确认理解是否一致 2.接到需求后仔细梳理需求文档,不清晰的及时和产品确认 3.根据需求文档编写概要设计和详细设计,详细设置需要有表结构和接口 4.开发高质量代码…

网络通信另个角度的认识(进程间通信),端口号(为什么要有,和pid的关系,分类,如何封装,和进程的定位原理+对应关系),客户端如何拿到服务端的port

目录 另一个角度认识网络通信 端口号 引入 -- 为什么要有端口号 问题 解决 端口号和pid 举例 介绍 分类 知名端口 注册端口 动态端口 客户端如何知道服务端的端口号 封装端口号 定位原理 进程和端口号的对应关系 数据如何被上层进程读到 另一个角度认识网络…

【Java EE初阶十一】多线程进阶二(CAS等)

1. 关于CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“&#xff0c;且比较交换的是寄存器和内存&#xff1b; 一个 CAS 涉及到以下操作&#xff1a; 下面通过语法来进一步进项说明&#xff1a; 下面有一个内存M&#xff0c;和两个寄存器A,B; CAS(M,A,B)&am…

SeaTunnel 2.3.4 Cluster in K8S

参考&#xff1a;seatunnel k8s运行zeta引擎&#xff08;cluster-mode模式&#xff09;_apache seatunnel zeta 启动-CSDN博客 以上参考使用的是2.3.3版本 下载2.3.4版本, 上dlcdn.apache.org下载 &#xff0c;官网下载有问题 wget https://dlcdn.apache.org/seatunnel/2.3.4/…

吴恩达机器学习-可选实验:梯度下降逻辑回归(Gradient Descent for Logistic Regression)

文章目录 目标数据集Logistic梯度下降梯度下降实现计算梯度&#xff0c;代码描述 另一个数据集 目标 在本实验中&#xff0c;你将: 更新逻辑回归的梯度下降在一个熟悉的数据集上探索梯度下降使用梯度下降给逻辑回归更新参数 import copy, math import numpy as np %matplotl…

Go微服务: 基于GRPC结合Consul实现微服务调用

基于GRPC结合Consul实现微服务调用 1 &#xff09;环境准备 基于 go workspace 准备3个包: protos&#xff0c;server, client新建 demo目录&#xff0c;其内部结构如下├── protos │ ├── go.mod │ └── users │ ├── users.proto │ …

怎么判断你的模型是好是坏?模型性能评估指标大全!

模型性能评估指标&#xff0c;大家一定不陌生&#xff01;很多小伙伴们都说难&#xff0c;但是它真的很重要很重要很重要&#xff01;它会对我们的模型有很多的指导&#xff0c;也会给我们真正做模型的时候提供一些指导性的思想&#xff0c;不然我们看到别人的东西只能跟着人家…

centos7.9升级ssh和openssl

一、环境 [roottmp179 package]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 [roottmp179 package]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 二、 升级前准备 mkdir /opt/package cd /opt/package wget https://www.openssl.org/source…

【linux】冯诺依曼体系与操作系统的理解

本篇文章是进程的预备知识&#xff0c;但也不仅仅是进程的预备知识&#xff0c; 也可以更好地帮助我们理解整个计算机体系。 目录 冯诺依曼体系结构&#xff1a;进一步理解操作系统&#xff1a; 冯诺依曼体系结构&#xff1a; 关于这张图先进行一下必要的解释&#xff1a; 输…

怎样通过IT服务台来增强IT项目管理?

当下&#xff0c;越来越多的企业和组织重视IT项目管理的重要性。而如何通过IT服务台来增强和提升IT项目管理效率&#xff0c;成为了许多企业领导和IT专业人员共同关注的话题。如何充分利用IT服务台&#xff0c;以促进IT项目管理水平的提升和项目成功率的增加变得至关重要。 1…

Codeforces Round 924 (Div. 2)---->B. Equalize

总思路&#xff1a;首先我们做这题的时候有两个点一定要知道&#xff1a; 1.当数组中有重复元素的时候&#xff0c;只有其中的一个才能贡献一个相同元素&#xff0c;其他的都不行&#xff08;因为是排列&#xff0c;一个数只出现一次&#xff09;&#xff0c;所以我们可以用使…

怎么免费下载无水印视频素材?赶快收藏这六个网站。

今天来教大家怎么下载无水印视频素材&#xff0c;其中一些是免费的&#xff0c;并且可以在商业项目中使用&#xff0c;这些网站都是无水印视频素材&#xff0c;可以放心使用。 蛙学网&#xff1a; 网站的内容非常丰富多彩&#xff0c;包括风景&#xff0c;夜景&#xff0c;食物…

论文阅读:Editing Large Language Models: Problems, Methods, and Opportunities

Editing Large Language Models: Problems, Methods, and Opportunities 论文链接 代码链接 摘要 由于大语言模型&#xff08;LLM&#xff09;中可能存在一些过时的、不适当的和错误的信息&#xff0c;所以有必要纠正模型中的相关信息。如何高效地修改模型中的相关信息而不影…