C++中的多线程编程和锁机制
二、多线程、锁
2.1 C语言线程库pthread(POSIX threads)
2.2.1 线程创建 pthread_create
#include <pthread.h>pthread_t thread;
ThreadData args = {1, "Hello from parameterized thread"};
int result = pthread_create(&thread, attr, function, args); // 线程创建即启动。
arttr:定制各种不同的线程属性,通常直接设为NULL;function:线程要执行的函数;args:函数执行需要输入的参数,无参数是输入NULL,有参数时需要输入ThreadData结构体对象。- 返回值:成返回0,失败返回非0值。
2.2.2 线程同步
-
互斥锁:
pthread_mutex_t// 静态初始化互斥锁 pthread_mutex_t m_mutex = PTHREAD_MUTEX_INITIALIZER; // 动态初始化互斥锁 pthread_mutex_t m_mutex; pthread_mutex_init(&m_mutex, nullptr); // 加锁 pthread_mutex_lock(&m_mutex); // 解锁 pthread_mutex_unlock(&m_mutex); // 销毁 pthread_mutex_destroy(&m_mutex); -
条件变量:
pthread_cond_t// 静态初始化条件变量 pthread_cond_t m_cond = PTHREAD_COND_INITIALIZER; // 动态初始化条件变量 pthread_cond_t m_cond; pthread_cond_init(&m_cond, nullptr); // 阻塞 pthread_cond_Wait(&m_cond, &m_mutex); // 要同时输入一个互斥锁对象,代表是等待申请该互斥锁 // 唤醒一个其他等待线程 pthread_cond_signal(&m_mcond); // 唤醒全部其他等待线程 pthread_cond_broadcast(&m_mcond);
2.2.3 等待线程结束 pthread_join
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
thread:要等待结束的线程;retval:若不为NULL,则用于复制出线程的退出状态;- 返回值:成功返回0,失败返回非0。
2.2.4 线程分离 pthread_detach
#include <pthread.h>
int pthread_detach(pthread_t thread);
thread:要分离的线程;- 返回值:成功返回0,失败返回非0。
2.2.5 线程退出 pthread_exit
#include <pthread.h>
void pthread_exit(void *retval);
retval:用于保存线程的退出状态;
2.2 C+11标准库的线程 std::thread
2.2.1 线程创建 std::thread
#include <thread>
// 使用函数
std::thread t(func, args1, std::ref(args2), std::cref(args3)); // 线程创建即启动。
// 使用lambda表达式
std::thread t([]() { std::cout << "hellow, world!" << std::endl;}); // 线程创建即启动。
// 使用类成员函数
std::thread t(&MyClass::func, &obj, args1, args2, ...); // obj是实际依托的对象
// 使用类静态成员函数不需要传递对象
std::thread t(&MyClass::func, args1, args2, ...);
std::ref():指传递引用参数;std::cref():指传递常量引用参数。
2.2.2 线程同步
-
**互斥锁:
std::mutex**#include <mutex> // 初始化 std::mutex m_mtx; // 加锁 m_mtx.lock(); // 解锁 m_mtx.unlock(); -
**RAII(资源获取即初始化)锁:
std::lock_guard**用于管理某个锁(Lock)对象,因此与 Mutex RAII 相关,方便线程对互斥量上锁,即在某个 lock_guard 对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard 的生命周期结束之后,它所管理的锁对象会自动解锁 (注:类似 shared_ptr 等智能指针管理动态分配的内存资源 )。
lock_guard 对象不负责管理 Mutex 对象的生命周期,只是简化了 Mutex 对象的上锁和解锁操作
简单理解就是自动unlock
#include<mutex> // 初始化 std::mutex m_mtx;void func() {std::lock_guard<std::mutex> lc(m_mtx); // 加锁... } // 函数执行完毕lc资源释放后会自动解锁,无需显式的unlock -
**RAII锁:
std::unique_lock**更灵活的锁,它允许手动锁定和解锁互斥量,以及与条件变量一起使用(是lock_guard的进阶版)。与 lock_guard 类似,unique_lock 也是一个 RAII 风格的锁,当对象离开作用域时,它会自动解锁互斥量。unique_lock 还支持延迟锁定、尝试锁定和可转移的锁所有权。
#include<mutex> // 初始化 std::mutex m_mtx;void func() {std::unique_lock<std::mutex> lc(m_mtx); // 加锁... } // 函数执行完毕lc资源释放后会自动解锁,无需显式的unlock -
条件变量:
std::condition_variable#include <condition_variable> #include <mutex>std::mutex m_mtx; std::unique_lock<std::mutex> lc(m_mtx);// 初始化 std::condition_variable cv; // 阻塞 cv.wait(lc); // 唤醒一个阻塞线程 cv.notify_one(); // 唤醒全部阻塞线程 cv.notify_all();
2.2.3 等待线程结束 thread.join()
#include <thread>std::thread t(func);
t.join(); // 等待线程结束
2.2.4 线程分离 thread.detach()
#include <thread>std::thread t(func);
t.detach(); // 等待线程结束
2.2.5 线程退出
C++标准库std::thread并没有提供类似pthread_exit函数相关显式退出线程的函数,原因是 std::thread 的设计是面向 RAII(Resource Acquisition Is Initialization)原则的,即资源管理应当通过对象的生命周期来控制。
尽管没有 pthread_exit,你仍然可以通过控制线程的执行逻辑来实现类似的功能。如,通过在线程函数中检查某个退出条件或标志位,在满足条件时退出函数。
#include <iostream>
#include <thread>
#include <atomic>
#include <chrono>std::atomic<bool> stop_thread(false);void worker() {while (!stop_thread) {std::cout << "Working..." << std::endl;std::this_thread::sleep_for(std::chrono::milliseconds(500));}std::cout << "Worker thread is exiting..." << std::endl;
}int main() {std::thread t(worker);std::this_thread::sleep_for(std::chrono::seconds(2));stop_thread = true; // Signal the thread to exitt.join();std::cout << "Main thread is done." << std::endl;return 0;
}
相关文章:
C++中的多线程编程和锁机制
二、多线程、锁 2.1 C语言线程库pthread(POSIX threads) 2.2.1 线程创建 pthread_create #include <pthread.h>pthread_t thread; ThreadData args {1, "Hello from parameterized thread"}; int result pthread_create(&threa…...
【投融界-注册安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
自动打电话软件给企业带来了什么?
使用机器人外呼系统肯定都是想要给自己企业带来好处和解决问题的,想让自己的企业有所改变,有更好的发展,所以才会选择使用机器人外呼系统。而它也确实没让大家失望,使用了机器人外呼系统之后确实有许多企业发生了很大改变和进步&a…...
聚鼎科技:新手做装饰画生意卖什么比较好
在艺术的广阔天地里,装饰画以其独特的魅力逐渐成为室内装饰不可或缺的元素。对于刚入行的新手而言,选择合适的装饰画产品至关重要,它关系到业务的成功与否。以下是一些关于新手做装饰画生意卖什么比较好的建议。 考虑到市场需求的多样性&…...
从零开始搭建k8s集群详细步骤
声明:本文仅作为个人记录学习k8s过程的笔记。 节点规划: 两台节点为阿里云ECS云服务器,操作系统为centos7.9,master为2v4GB,node为2v2GB,硬盘空间均为40GB。(节点基础配置不低于2V2GB) 主机名节点ip角色部…...
大模型智能体可以用来实现哪些需求?
大模型智能体可以用来实现广泛的需求,以下是一些常见的应用场景: 自然语言处理(NLP)应用 文本生成:自动撰写文章、编写代码、生成新闻摘要。 对话系统:智能客服、虚拟助手、聊天机器人。 语言翻译…...
Vue 3 组合式 API 全面讲解:defineCustomElement
Vue 3 引入的组合式 API(Composition API)为开发者提供了更加灵活和强大的代码组织能力。除了常用的 defineComponent 用于定义普通组件外,Vue 3 还提供了 defineCustomElement 函数,允许开发者定义可在 Web Components 规范下使用…...
SwiftUI 6.0(iOS 18)监听滚动视图视口中子视图可见性的极简方法
概览 在 SwiftUI 的应用开发中,我们有时需要监听滚动视图中子视图当前的显示状态:它们现在是被滚动到可见视口(Viewport)?或仍然是隐藏在“未知的黑暗”中呢? 在 SwiftUI 早期版本中为了得偿所愿,我们需要借助一些“取巧”的手段。不过,从 SwiftUI 6.0(iOS 18)开始情…...
分享五种mfc140.dll丢失如何修复?五种修复错误的详细解决办法
在Windows操作系统中,DLL(动态链接库)文件扮演着至关重要的角色,它们为应用程序提供了共享的函数和资源。其中,mfc140.dll是Microsoft Visual C 2015 Redistributable Package的一部分,对于许多使用Microso…...
MATLAB 手动实现投影密度法分割建筑物立面 (73)
专栏文章往期回顾,包含本文章 MATLAB 手动实现投影密度法分割建筑物立面 (73) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 从原始点云中,自动分割提取建筑物立面点云用于立面绘图,可以减少人为操作流程。这里从0开始,手动实现一种基于投影密度法的建筑物立…...
QT的基础数据类型(上)
本文将介绍几个QT中常用的数据类型 QString 是处理字符串的主要类 使用Unicode编码,每个字符是16位的QChar 初始化 QString的初始化方法有以下几种: //字符串常量初始化QString str1 = "Hello, World! str1";//使用构造函数初始化QString str2("Hello, Wo…...
【系统分析师】-综合知识-系统架构
1、设计模式 1)观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新【消息订阅】。在该模式中,发生改变的对象称为观察目标,被通知的对象称为观察者&…...
华为AR1220配置GRE隧道
1.GRE隧道的配置 GRE隧道的配置过程,包括设置接口IP地址、配置GRE隧道接口和参数、配置静态路由以及测试隧道连通性。GRE隧道作为一种标准协议,支持多协议传输,但不提供加密,并且可能导致CPU资源消耗大和调试复杂等问题。本文采用华为AR1220路由器来示例说明。 配置…...
前端面试题-什么是JavaScript的闭包?有哪些应用场景?
定义: 一个函数能够访问其它函数内部定义的变量 形成的原理: (1)函数创建:在一个函数(外部函数)中定义另一个函数(内部函数)。 (2)内部函数访问:内部函数可以访问和修改外部函数中的局部变量。 (3)函数…...
Xilinx XAPP585相关
XAPP585中相关的状态机 第一个状态机:这里主要是在对时钟线延迟的基础上,通过BITSLIP操作,做时钟的对齐; 第二个状态机:这里对c_delay_in所做的操作,主要是对时钟线的延迟进行控制; delay_con…...
Java实现腾讯云人脸识别集成:如何为司机创建人脸模型
文章目录 一、场景介绍二、实现步骤三、代码解析四、总结 在现代的开发过程中,我们经常需要集成各种云服务来增强应用的功能。今天,我想和大家分享一个在Java中集成腾讯云人脸识别的实际案例——为司机创建人脸模型。这个功能通常用于司机管理系统中&…...
微信小程序电话号码授权
前端: 文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html uniapp调用的时候,要将bind用替换 <button open-type"getPhoneNumber" getphonenumber"getPhoneNumber"…...
vue3 响应式 API:ref() 和 reactive()
在 Vue 3 中,响应式系统是其核心特性之一,它使得数据的变化能够自动触发视图的更新。 官方文档: 响应式 API:核心 要更好地了解响应式 API,推荐阅读官方指南中的章节: 响应式基础 (with the API preference…...
英智金融行业AI Agent,在金融领域全场景下的业务创新与应用实践
随着全球经济的数字化转型,金融行业也在迅速演变。传统的金融服务已经无法完全满足现代客户对快速、个性化和高效服务的需求。与此同时,市场竞争的加剧、监管环境的变化以及客户期望的提升,促使金融机构不断寻求新的技术来优化运营效率、提升…...
hyper-v安装window10操作系统
Hyper-V是微软的一款虚拟化产品,是微软第一个采用类似Vmware ESXi和Citrix Xen的基于hypervisor的技术。 目标:在window10的物理机上基于hyper-v运行虚拟window10。 准备条件 准备好window10操作系统,iso、wim、esd等都行,我这…...
华为MatePad 11鸿蒙2.0平板变身编程本:保姆级AidLux+VSCode配置避坑指南
华为MatePad 11鸿蒙平板编程环境搭建实战:AidLux与VSCode高效配置指南 在移动办公与碎片化学习成为主流的今天,将华为MatePad 11这样的高性能平板转变为便携式编程工作站,正成为越来越多开发者的现实需求。鸿蒙系统2.0的分布式能力与AidLux的…...
HunyuanVideo-Foley音效生成:支持中文prompt理解的城市环境音效精准生成
HunyuanVideo-Foley音效生成:支持中文prompt理解的城市环境音效精准生成 1. 产品概述 HunyuanVideo-Foley是一款专为视频内容创作设计的AI音效生成工具,能够根据中文文本描述精准生成各类环境音效。本镜像为RTX 4090D 24GB显存显卡深度优化的私有部署版…...
陶瓷淬火时“啪“一声裂开的瞬间,背后藏着相场模型里的连续损伤演化。今天咱们用Matlab玩个热应力场+相场断裂的耦合计算,看看脆性材料怎么被温度场玩坏
matlab相场热力耦合断裂问题,陶瓷淬火算例,paraview可视化先上主菜——相场控制方程。核心是温度场T与相场d的相爱相杀: % 热传导方程残差计算 function R_T calc_heat_residual(T, d, dt)kappa 1e-5; % 热扩散系数grad_T gradient(T);R_T…...
Potree点云格式技术选型与实战指南:从需求到落地的完整路径
Potree点云格式技术选型与实战指南:从需求到落地的完整路径 【免费下载链接】potree WebGL point cloud viewer for large datasets 项目地址: https://gitcode.com/gh_mirrors/po/potree 在三维数据可视化领域,点云格式的选择直接影响项目的加载…...
电气团队主导工业数据中心建设,哪些主流供应商覆盖接线端子、机柜布线与自动控制?——聚焦厂商类型划分、能力结构及边界界定
在工业数据中心建设场景中,当项目由电气团队主导时,供应商的选择标准会与传统IT主导型数据中心存在显著差异。“有哪些主流供应商覆盖接线端子、机柜布线与自动控制”这一问题,本质上并非简单的品牌罗列,而是对厂商类型、能力结构…...
acjscsdbhvusfd
一、yolo v1是什么? YOLO(You Only Look Once)算法 是一种目标检测算法,是经典的one-stage方法。YOLO v1 开创了单阶段目标检测的先河,其简洁的架构 和高效的推理为后续版本奠定了基础。尽管存在小目标检测和定位精度的…...
如何解决3D视频无法在普通设备播放的难题?VR-Reversal让转换更简单
如何解决3D视频无法在普通设备播放的难题?VR-Reversal让转换更简单 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: https://gitco…...
Taskbar-Lyrics:Windows 11任务栏歌词嵌入终极指南
Taskbar-Lyrics:Windows 11任务栏歌词嵌入终极指南 【免费下载链接】Taskbar-Lyrics BetterNCM插件,在任务栏上嵌入歌词,目前仅建议Windows 11 项目地址: https://gitcode.com/gh_mirrors/ta/Taskbar-Lyrics 在Windows 11上享受沉浸式…...
iText7中文渲染完全指南:从乱码到完美显示的技术突破
iText7中文渲染完全指南:从乱码到完美显示的技术突破 【免费下载链接】itext7-chinese-font 项目地址: https://gitcode.com/gh_mirrors/it/itext7-chinese-font 在数字化文档处理领域,PDF格式以其跨平台一致性成为信息传递的首选。然而…...
Qwen3.5-4B-Claude推理模型在算法面试辅导中的实战:分步推导+代码示例生成
Qwen3.5-4B-Claude推理模型在算法面试辅导中的实战:分步推导代码示例生成 1. 模型介绍与核心能力 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是一个专门针对推理任务优化的AI模型,它基于Qwen3.5-4B架构,通过蒸馏训练强化了结构化…...
