当前位置: 首页 > news >正文

C++多线程常用方法

在 C++ 中,线程相关功能主要通过头文件提供的类和函数来实现,以下是一些常用的线程接口方法和使用技巧:

std::thread类

构造函数:
可以通过传入可调用对象(如函数指针、函数对象、lambda 表达式等)来创建一个线程实例,启动一个新线程去执行对应的任务。例如:

#include <iostream>
#include <thread>void hello() {std::cout << "Hello from thread!" << std::endl;
}int main() {std::thread t(hello);  // 创建线程t并开始执行hello函数t.join();  // 等待线程t执行完毕return 0;
}

这里std::thread t(hello)就是利用函数指针hello创建线程,新线程会执行hello函数里的代码。

join方法:
用于阻塞当前线程,直到被调用的线程执行完成。比如在上面的main函数中,t.join()会让main线程暂停,等待t线程把hello函数执行完后再继续往下执行。
detach方法
将线程分离,使得线程在后台独立运行,不再与创建它的std::thread对象关联。此后,无法再通过该std::thread对象对这个线程进行控制(比如不能再调用join了)。示例:

#include <iostream>
#include <thread>void func() {// 线程执行的函数内容std::cout << "Thread is running independently." << std::endl;
}int main() {std::thread t(func);t.detach();  // 分离线程t// 主线程继续执行其他操作,不用等待t线程结束std::cout << "Main thread continues." << std::endl;return 0;
}

线程传参
向线程函数传递参数时,需要保证参数在传递时是有效的,且在被调用函数执行期间持续有效(比如避免传引用指向临时对象等情况)。例如:

#include <iostream>
#include <thread>void print_num(int num) {std::cout << "The number is: " << num << std::endl;
}int main() {int num = 10;std::thread t(print_num, num);  // 传递普通变量num作为参数t.join();return 0;
}

如果要传递类对象等更复杂的情况,要注意拷贝、移动语义等相关问题,确保参数传递的正确性。
线程 ID 获取
可以通过std::this_thread::get_id获取当前线程的线程 ID,或者通过std::thread对象的get_id成员函数获取对应的线程 ID,用于标识和区分不同线程。示例:

#include <iostream>
#include <thread>void show_thread_id() {std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
}int main() {std::thread t(show_thread_id);std::cout << "Main thread ID: " << std::this_thread::get_id() << std::endl;t.join();return 0;
}

线程同步相关(例如互斥量等,用于解决多线程访问共享资源冲突问题)

std::mutex(互斥量):
通过lock和unlock方法对共享资源进行加锁和解锁,确保同一时刻只有一个线程能访问被保护的共享资源。例如:

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;
int shared_data = 0;void increment() {for (int i = 0; i < 1000; ++i) {mtx.lock();  // 加锁shared_data++;mtx.unlock();  // 解锁}
}int main() {std::thread t1(increment);std::thread t2(increment);t1.join();t2.join();std::cout << "Shared data value: " << shared_data << std::endl;return 0;
}

也可以使用std::lock_guard等 RAII(Resource Acquisition Is Initialization)机制的类来更方便、安全地管理互斥量的生命周期,自动完成加锁和解锁,如:

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;
int shared_data = 0;void increment() {for (int i = 0; i < 1000; ++i) {std::lock_guard<std::mutex> guard(mtx);  // 构造时加锁,析构时自动解锁shared_data++;}
}int main() {std::thread t1(increment);std::thread t2(increment);t1.join();t2.join();std::cout << "Shared data value: " << shared_data << std::endl;return 0;
}

std::condition_variable(条件变量):
常和互斥量配合使用,用于线程间的同步,实现一个线程等待某个条件满足后再继续执行的功能。比如一个线程等待另一个线程修改共享资源达到某个条件后再进行后续操作,典型用法如下:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void wait_for_signal() {std::unique_lock<std::mutex> lck(mtx);cv.wait(lck, []{ return ready; });  // 等待条件满足(ready为true)std::cout << "Received signal and continue." << std::endl;
}void send_signal() {{std::lock_guard<std::mutex> lck(mtx);ready = true;}cv.notify_one();  // 通知等待在该条件变量上的一个线程
}int main() {std::thread t1(wait_for_signal);std::thread t2(send_signal);t1.join();t2.join();return 0;
}

这些就是 C++ 中线程相关的一些主要接口方法及其基本使用方式,在实际多线程编程中,往往需要综合运用它们来实现高效、正确的并发程序逻辑。

相关文章:

C++多线程常用方法

在 C 中&#xff0c;线程相关功能主要通过头文件提供的类和函数来实现&#xff0c;以下是一些常用的线程接口方法和使用技巧&#xff1a; std::thread类 构造函数&#xff1a; 可以通过传入可调用对象&#xff08;如函数指针、函数对象、lambda 表达式等&#xff09;来创建一…...

【网络安全】Web Timing 和竞争条件攻击:揭开隐藏的攻击面

Web Timing 和竞争条件攻击&#xff1a;揭开隐藏的攻击面 在传统的 Web 应用中&#xff0c;漏洞的发现和利用通常相对容易理解。如果代码存在问题&#xff0c;我们可以通过发送特定输入来强制 Web 应用执行非预期的操作。这种情况下&#xff0c;输入和输出之间往往有直接关系&…...

12月最新编程语言排行榜

“岁末将至&#xff0c;2024年的编程世界又发生了哪些变化&#xff1f;是Python依然稳坐王座&#xff0c;还是有新语言杀出重围&#xff1f;让我们一起看看12月最新编程语言排行榜&#xff0c;寻找未来技术的风向标。” 今年&#xff0c;哪些编程语言成为行业焦点&#xff1f;…...

迭代器模式

迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为设计模式&#xff0c;它提供了一种方法来访问一个聚合对象中的各个元素&#xff0c;而又不暴露其内部的表示。这种模式允许你逐个访问对象中的元素&#xff0c;而无需知道其底层的数据结构。迭代器模…...

探秘 WB 实验:AI 助力攻克操作难关

在生物学研究的浩瀚领域中&#xff0c;WB 实验犹如一座关键的灯塔&#xff0c;照亮了我们探索蛋白质世界的道路。今天&#xff0c;就让我们一同深入了解 WB 实验的全貌&#xff0c;以及 AI 如何在其中发挥神奇作用&#xff0c;帮助我们应对实际操作中的重重挑战。 WB 实验&…...

labelimg使用指南

YOLOv8目标检测(一)_检测流程梳理&#xff1a;YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集&#xff1a;YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型&#xff1a;YOLOv8目标检测(三)_训…...

车载终端_智能车载终端定制_农机/出租车/叉车/驾培车载终端MTK方案

车载终端集成了先进的技术和卓越的性能&#xff0c;采用了联发科的高效低功耗ARM处理器&#xff0c;具备八核架构&#xff0c;主频高达2.0GHz&#xff0c;基于12nm制程工艺&#xff0c;不仅性能强劲&#xff0c;而且功耗控制出色。基本配置为4GB内存与64GB存储&#xff0c;用户…...

Unity中Pico实现透视

1.参照Pico官方【透视 | PICO 开发者平台】文档设置。 2.额外的需要将主相机的post processing禁用。...

elk部署与实战案例

**ELK Stack** 是一个非常强大的日志处理和分析平台&#xff0c;由 **Elasticsearch**、**Logstash** 和 **Kibana** 三个组件组成。它被广泛应用于日志收集、搜索、分析和可视化。ELK 可以处理大量数据&#xff0c;并帮助用户从中提取有价值的信息。以下是一个从部署到实际应用…...

Isaac Gym, Sim, Lab

本文仅为个人学习笔记&#xff0c;文章参考请见参考资料部分&#xff0c;主要目的是进行多场景并行仿真测试&#xff0c;笔记中大部分内容都是针对于这个目标。 参考资料 常见问题 — Isaac Lab 文档 https://github.com/isaac-sim/IsaacLab 一. Gym, Sim, Lab 之间的关系 Is…...

活着就好20241217

亲爱的朋友们&#xff0c;大家早上好&#xff01;&#x1f31e; 今天是17号&#xff0c;星期二&#xff0c;2024年12月的第十七天&#xff0c;同时也是第50周的第八天&#xff0c;农历甲辰[龙]年十一月初十三日。在这晨光熹微的美好时刻&#xff0c;愿那温暖而明媚的阳光轻轻拂…...

第十六章:IO流 (java.io包中)

一、理解 1. 简单而言&#xff1a;流就是内存与存储设备之间传输数据的通道、管道。 2. 分类&#xff1a; (1) 按方向 ( 以 JVM 虚拟机为参照物 ) 【重点】 输入流&#xff1a;将 < 存储设备 > 中的内容读入到 < 内存 > 中。 输出流&#xff1a;将 < 内…...

Introduction to NoSQL Systems

What is NoSQL NoSQL database are no-tabular非數據表格 database that store data differently than relational tables 其數據的存儲方式與關係型表格不同 Database that provide a mechanism機制 for data storage retrieval 檢索 that is modelled in means other than …...

【JVM】JVM基础教程(四)

上一章&#xff1a;【JVM】JVM基础教程&#xff08;三&#xff09;-CSDN博客 目录 自动垃圾回收 方法区的回收 方法区回收条件 手动触发回收 堆回收 如何判断堆上的对象可以回收&#xff1f; 可以给对象引用赋值null&#xff0c;切断引用 引用计数法 循环引用缺点 查…...

前端实现在线预览excel文件

在前端开发中&#xff0c;经常会遇到需要在线预览各种文件的需求。本文将介绍如何使用前端技术实现在线预览 Excel 文件的功能。 一、基于微软office服务的excel预览 获取要预览的 Excel 文件的 URL&#xff08;例如存储在 OneDrive 或 SharePoint 上的文件&#xff09;。 使…...

Python 写的《桌面时钟》屏保

原代码&#xff1a; # 日历式时钟 # 导入所需的库 # 作者&#xff1a;Hoye # 日期&#xff1a;2024年12月16日 # 功能&#xff1a;显示当前日期、星期、时间&#xff0c;并显示模拟时钟 import tkinter as tk from tkinter import ttk import time import math import sysdef …...

计算机视觉单阶段实例分割实践指南与综述

概述 原文地址&#xff1a;https://towardsdatascience.com/single-stage-instance-segmentation-a-review-1eeb66e0cc49 实例分割是一项具有挑战性的计算机视觉任务&#xff0c;需要预测对象实例及其每像素分割掩码。这使其成为语义分割和目标检测的混合体。 自 Mask R-CNN …...

Axios结合Typescript 二次封装完整详细场景使用案例

Axios 是一个基于 promise 的 HTTP 客户端&#xff0c;用于浏览器和 node.js。二次封装 Axios 主要是为了统一管理 HTTP 请求&#xff0c;例如设置统一的请求前缀、头部、超时时间&#xff0c;统一处理请求和响应的格式&#xff0c;以及错误处理等。 以下是一个使用 TypeScrip…...

C++面试:HTTP1.0/1.1,HTTP2.0,HTPP3.0的区别

1.你对HTTP1.0/1.1&#xff0c;HTTP2.0&#xff0c;HTPP3.0有什么了解&#xff1f; 答&#xff1a;HTTP1.0&#xff1a; ①属于无连接式&#xff0c;每次发送HTTP请求都需要建立TCP连接。 ②会造成发送时的对头阻塞&#xff0c;当上一个请求没有应答&#xff0c;当前的请求就会…...

使用 Docker Compose 部署 Redis 主从与 Sentinel 高可用集群

文章目录 使用 Docker Compose 部署 Redis 主从与 Sentinel 高可用集群Redis 主从架构简介Redis Sentinel 简介配置文件1. 主节点配置 (redis-master.conf)2. 从节点配置 (redis-slave1.conf 和 redis-slave2.conf)redis-slave1.confredis-slave2.conf3. Sentinel 配置 (sentin…...

【Java】4、虚拟机 JVM

目录 Java内存区域详解(重点) JVM垃圾回收详解(重点) 类文件结构详解 类加载过程详解 类加载器详解(重点) 最重要的JVM参数总结 JDK监控和故障处理工具总结 JVM线上问题排查和性能调优案例 参考&#xff1a; JVM 核心技术 32 讲 深入浅出 Java 虚拟机...

Vue3之组合式API详解

Vue 3引入了一种新的API风格——组合式API&#xff08;Composition API&#xff09;&#xff0c;旨在提升组件的逻辑复用性和可维护性。本文将详细阐述Vue 3中的组合式API&#xff0c;包括其定义、特点、使用场景、优势等&#xff0c;并给出具体的示例代码。 一、定义 组合式…...

Flutter编译Module was compiled with an incompatible version of Kotlin错误解决

文章目录 编译报错如下解决方法修复方案 编译报错如下 e: C:/Users/YUAN/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.9.20/e58b4816ac517e9cc5df1db051120c63d4cde669/kotlin-stdlib-1.9 .20.jar!/META-INF/kotlin-stdlib-jdk8.kotlin_module:…...

Uniapp插件如何通过NFC读取多种证卡信息?

nfc读卡uniapp插件&#xff0c;由中软高科进行开发&#xff0c;主要是通过NFC读取居民身份证、港澳台居住证、外国人居住证、护照等证卡的信息。经过多个版本的升级更新&#xff0c;目前性能已趋于稳定&#xff0c;并且读卡速度较之最初版本有了大的提升。 注意事项 测试使用的…...

本地docker镜像改名字

如果你想修改本地 Docker 镜像的名字&#xff0c;可以通过创建该镜像的新标签&#xff08;tag&#xff09;来实现。Docker 中没有直接修改镜像名字的命令&#xff0c;但可以通过重新打标签的方式实现类似的效果。以下是具体步骤&#xff1a; 查看当前镜像&#xff1a; docker…...

VS Code 远程连接 SSH 服务器

文章目录 一、安装 Remote - SSH 扩展并连接远程主机二、免密连接远程主机1. 生成 SSH 密钥对2. 将公钥复制到远程服务器3. 配置 SSH 客服端4. 连接测试 随着技术的不断迭代更新&#xff0c;在 Linux 系统中使用 Vim、nano 等基于 Shell 终端的编辑器&#xff08;我曾经也是个 …...

艾体宝案例丨CircleCI 助力 ANA Systems 打造高效 CI/CD 模型

在现代软件开发领域&#xff0c;效率和可靠性是企业在竞争中取胜的关键。本文将深入探讨 ANA Systems 如何通过引入业界领先的 CI/CD 平台——CircleCI&#xff0c;克服传统开发流程的瓶颈&#xff0c;实现开发运营效率的全面提升。同时&#xff0c;本文还将详细解析 CircleCI …...

vue 上传组件 vxe-upload 实现拖拽调整顺序

vue 上传组件 vxe-upload 实现拖拽调整顺序&#xff0c;通过设置 drag-sort 参数就可以启用拖拽排序功能 官网&#xff1a;https://vxeui.com/ 图片拖拽排序 <template><div><vxe-upload v-model"imgList" mode"image" multiple drag-sor…...

Elasticsearch的一些介绍

你想问的可能是 **Elasticsearch**&#xff0c;以下是关于它的一些介绍&#xff1a; ### 概述 Elasticsearch是一个基于Apache Lucene库构建的开源分布式搜索和分析引擎&#xff0c;采用Java语言编写&#xff0c;具有高性能、可扩展性和易用性等特点&#xff0c;可用于各种数据…...

从源码构建安装Landoop kafka-connect-ui

背景 部署Landoop kafka-connect-ui最简单的办法还是通过docker来部署&#xff0c;我们之前的kafka-connect-ui就是通过docker部署的&#xff0c;但是&#xff0c;最近发现个问题&#xff1a;当使用docker部署且防火墙使用的是firewalld的情况下&#xff0c;就会出现端口冲突。…...

MybatisPlus-扩展功能

代码生成 在使用MybatisPlus以后&#xff0c;基础的Mapper、Service、PO代码相对固定&#xff0c;重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据库表结构生成PO、Mapper、Service等相关代码。只不过代码生成器同样要编码使用&#xff0c;也很麻烦。 这里…...

发布/部署WebApi服务器(IIS+.NET8+ASP.NETCore)

CS软件授权注册系统-发布/部署WebApi服务器(IIS.NET8ASP.NETCore) 目录 本文摘要VS2022配置发布VS2022发布WebApiIIS服务器部署WebApi 将程序文件复制到云服务器添加网站配置应用程序池配置dns域名配置端口阿里云ECS服务器配置19980端口配置https协议 (申请ssl证书)测试WebAp…...

【2025最新计算机毕业设计】基于SpringBoot+Vue城市中小学体育场馆预约系统【提供源码+答辩PPT+文档+项目部署】

一、项目技术架构&#xff1a; 本项目是一款城市中小学体育场馆预约系统的设计与实现。 该SpringBootVue的城市中小学体育场馆预约系统&#xff0c;后端采用SpringBoot架构&#xff0c;前端采用VueElementUI实现页面的快速开发&#xff0c;并使用关系型数据库MySQL存储系统运行…...

Spring Security 6 系列之二 - 基于数据库的用户认证和认证原理

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级为6.3.0&#xff0c;关键是其风…...

vue中打包dist文件内static 和 assets 的区别

背景 在Vue.js项目中&#xff0c;assets 和 static 是两个用于存放静态资源的文件夹&#xff0c;但它们在使用方式和处理机制上有所不同 用途 assets: assets 文件夹通常用于存放那些需要在构建过程中被Webpack处理的静态资源。这些资源可以包括图片、字体、样式文件&#…...

Big Model weekly | 第49期

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 01 Magnetic Preference Optimization: Achieving Last-iterate Convergence for Language Models Alignment 自我对弈方法在多个领域增强模型能力方面展现出了显著的成功。在基于人类反馈的强化学习&#xff0…...

Node.js内置模块

1.内置模块 Node.js的中文网参考手册:https://nodejs.cn//api 帮助文档 API文档:查看对应的模块,左边是模块,右边是模块的成员 源码:https://github.com/nodejs/node/tree/main/lib 查看 例如: http.js 创建web服务器的模块 -->进入源码中,搜索…...

使用Nexus3搭建npm私有仓库

一、npm介绍 npm的全称是Node Package Manager&#xff0c;它是一个开放源代码的命令行工具&#xff0c;用于安装、更新和管理Node.js模块。npm是Node.js的官方模块管理器&#xff0c;它允许用户从一个集中的仓库中下载和安装公共的Node.js模块&#xff0c;并将这些模块集成到…...

MySQL学习之表操作

MySQL学习之表操作 基础命令 查询当前所在数据库的所有表 show tables;查看指定的表结构, 可以查看到指定表的字段&#xff0c;字段的类型、是否可以为NULL&#xff0c;是否存在默认值等信息 mysql> desc user; ----------------------------------------------- | Field |…...

C语言学习day22:ReadProcessMemory函数/游戏内存数据读取工具开发

简言&#xff1a; ReadProcessMemory函数是 Windows API 中的一个函数&#xff0c;用于从目标进程的虚拟内存空间中读取数据。这个函数非常有用&#xff0c;尤其是在进行内存分析、调试、或某些类型的逆向工程时。 ReadProcessMemory函数 函数原型 BOOL ReadProcessMemory(…...

Linux虚拟文件系统

参考&#xff1a;深入分析LINUX内核源码 深入分析Linux内核源码 (kerneltravel.net) 作为一个最著名的自由软件&#xff0c;Linux 确实名不虚传&#xff0c;几乎处处体现了“自由”&#xff0c;你可以编译适合自己系统要求的内核&#xff0c;或者轻松添加别人开发的新的模块。只…...

OpenIPC开源FPV之Adaptive-Link天空端代码解析

OpenIPC开源FPV之Adaptive-Link天空端代码解析 1. 源由2. 框架代码3. 报文处理3.1 special报文3.2 普通报文 4. 工作流程4.1 Profile 竞选4.2 Profile 研判4.3 Profile 应用 5. 总结6. 参考资料7. 补充资料7.1 RSSI 和 SNR 的物理含义7.2 信号质量加权的理论依据7.3 实际应用中…...

NPU是什么?电脑NPU和CPU、GPU区别介绍

随着人工智能技术的飞速发展&#xff0c;计算机硬件架构也在不断演进以适应日益复杂的AI应用场景。其中&#xff0c;NPU&#xff08;Neural Processing Unit&#xff0c;神经网络处理器&#xff09;作为一种专为深度学习和神经网络运算设计的新型处理器&#xff0c;正逐渐崭露头…...

.Net WebAPI(一)

文章目录 项目地址一、WebAPI基础1. 项目初始化1.1 创建简单的API1.1.1 get请求1.1.2 post请求1.1.3 put请求1.1.4 Delete请求 1.2 webapi的流程 2.Controllers2.1 创建一个shirts的Controller 3. Routing3.1 使用和创建MapControllers3.2 使用Routing的模板语言 4. Mould Bind…...

.NET 技术 | 调用系统API创建Windows服务

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…...

OpenLinkSaas 2025年1月开发计划

先来看看OpenLinkSaas的大目标 在OpenLinkSaas的产品目标中&#xff0c;让开发人员更加方便的使用云资源是目标之一。通过各大云厂商的API&#xff0c;来可视化云上基础设施的数据是远远不够的。我们准备在2025年1月份增加方便管理和运营研发场景下服务器的能力。 这部分的功能…...

同态加密算法详解及Python实现

目录 同态加密算法详解及Python实现第一部分:同态加密概述与原理1.1 什么是同态加密?同态加密的定义:1.2 同态加密的分类1.3 同态加密的优势与挑战优势挑战第二部分:常见同态加密算法及其应用场景2.1 RSA同态加密支持操作应用场景2.2 Paillier加密支持操作应用场景2.3 Gent…...

【HarmonyOS NEXT】ArkTs函数、类、接口、泛型、装饰器解析与使用

1. 前置学习文档 【HarmonyOS NEXT】ArkTs数据类型解析与使用(https://juejin.cn/spost/7448894500348608522) 2. 前言 在原生JavaScript中只有函数和类的实现&#xff0c;为了更好的面向对象编程&#xff0c;TypeScript 引入了接口、泛型、装饰器等特性。ArkTS也继承了这些特性…...

【数学】矩阵的逆与伪逆 EEGLAB

文章目录 前言matlab代码作用EEGLAB 中的代码总结参考文献 前言 在 EEGLAB 的使用中&#xff0c;运行程序时出现了矩阵接近奇异值&#xff0c;或者缩放错误。结果可能不准确。RCOND 1.873732e-20 的 bug&#xff0c;调查 EEGLAB 后发现是 raw 数据的问题。 matlab代码 A_1 …...

用github镜像加速, --recursive还是去github站怎么处理?

小伙伴们大多碰到过github抽风的情况&#xff0c;时通时断&#xff0c;时快时慢&#xff0c;非常考验心情。 以前碰到连不上的时候&#xff0c;我大多就是在gitee和gitcode网站找一下镜像&#xff0c;找到后直接git clone 新地址即可。但是碰到 --recursive的时候就不行了&…...