C++11 在 Windows 环境下的多线程编程指南
引言
随着多核处理器的普及,利用多线程编程来提升应用程序性能变得越来越重要。C++11 标准库引入了一系列用于多线程编程的API,使得多线程编程变得更加简洁和高效。
一、基本概念
在开始编写多线程代码之前,了解一些基本概念是非常重要的:
- 线程:线程是操作系统能够调度的最小执行单元。一个进程可以包含多个线程,这些线程共享进程的资源,但可以独立执行。
- 并行和并发:并行是指多个线程同时执行,而并发是指多个线程在同一时间段内交替执行。
二、创建和管理线程
C++11标准库提供了std::thread类来创建和管理线程。我们可以通过以下几种方式创建线程:
1. 创建线程
(1)使用函数指针
#include <iostream>
#include <thread>void threadFunction() {std::cout << "Hello from thread!\n";
}int main() {std::thread t(threadFunction);t.join(); // 等待线程t完成return 0;
}
(2)使用lambda表达式
#include <iostream>
#include <thread>int main() {std::thread t([]{std::cout << "Hello from lambda thread!\n";});t.join();return 0;
}
(3)使用成员函数
#include <iostream>
#include <thread>class MyClass {
public:void memberFunction() {std::cout << "Hello from member function thread!\n";}
};int main() {MyClass obj;std::thread t(&MyClass::memberFunction, &obj);t.join();return 0;
}
2. 线程同步
在多线程编程中,同步是一个关键问题,C++11 提供了多种同步机制,包括互斥量(std::mutex)、锁(std::lock_guard 和 std::unique_lock)、条件变量(std::condition_variable)等。
(1)互斥量
互斥量用于保护共享数据,防止数据竞争。
#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void printMessage(const std::string& msg) {std::lock_guard<std::mutex> lock(mtx);std::cout << msg << 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;
}
(2)条件变量
条件变量用于线程间的通知机制。
#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 << "Thread is running!\n";
}int main() {std::thread t(printMessage);{std::lock_guard<std::mutex> lock(mtx);ready = true;}cv.notify_one();t.join();return 0;
}
3. 线程局部存储
C++11 提供了 thread_local 关键字,用于定义线程局部变量。
#include <iostream>
#include <thread>thread_local int threadId = 0;void printThreadId(int id) {threadId = id;std::cout << "Thread ID: " << threadId << std::endl;
}int main() {std::thread t1(printThreadId, 1);std::thread t2(printThreadId, 2);t1.join();t2.join();return 0;
}
4. 其他API
(1)std::async 和 std::future
std::async 用于异步执行任务,并返回一个 std::future 对象,用于获取异步任务的结果。
#include <iostream>
#include <future>int asyncFunction() {return 42;
}int main() {std::future<int> result = std::async(std::launch::async, asyncFunction);std::cout << "Async result: " << result.get() << std::endl;return 0;
}
(2)std::packaged_task
std::packaged_task 也用于异步执行任务,但它允许将任务包装成一个可调用对象,并与 std::future 关联。
#include <iostream>
#include <future>int taskFunction() {return 42;
}int main() {std::packaged_task<int()> task(taskFunction);std::future<int> result = task.get_future();std::thread(std::move(task)).detach();std::cout << "Task result: " << result.get() << std::endl;return 0;
}
三、总结
C++11 标准库提供了一套强大而简洁的多线程编程API,极大地简化了多线程编程的复杂性。通过 std::thread 类,我们可以方便地创建和管理线程;通过互斥量和条件变量等同步机制,我们可以有效地避免数据竞争;通过 std::async 和 std::future 等工具,我们可以轻松地实现异步编程。这些工具不仅适用于Windows环境,也适用于其他平台,使得我们的代码具有良好的可移植性。
更多详细代码:C++11多线程编程: Windows下C++11多线程编程
相关文章:
C++11 在 Windows 环境下的多线程编程指南
引言 随着多核处理器的普及,利用多线程编程来提升应用程序性能变得越来越重要。C11 标准库引入了一系列用于多线程编程的API,使得多线程编程变得更加简洁和高效。 一、基本概念 在开始编写多线程代码之前,了解一些基本概念是非常重要的&am…...
[数据集][目标检测]旋风检测数据集VOC+YOLO格式157张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):159 标注数量(xml文件个数):159 标注数量(txt文件个数):159 标注类别…...
智慧商砼搅拌车安监运营管理的创新实践
随着城市化进程的加速,商砼搅拌车作为城市建设的重要设备,其安全管理与运营效率直接关系到工程质量和施工进度。近年来,通过引入先进的4G无线视频智能车载终端套件,我们实现了对商砼搅拌车的高精度定位、实时音视频调度、实时油量…...
渗透测试框架提权
Metasploit自动提权 Meterpreter自动提权命令 getsystem: getsystem是由Metasploit-Framework提供的一个模块,它可以将一个管理帐户(通常为本地Administrator账户)提升为本地SYSTEM帐户 1)getsystem创建一个新的Windows服务&…...
tcp链接中的三次挥手是什么原因
一、tcp链接中的正常四次挥手过程? 刚开始双方都处于 ESTABLISHED 状态,假如是客户端先发起关闭请求。四次挥手的过程如下: 1、客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文…...
运维相关知识
一、运维需要关注 服务器的哪些数据? 1. CPU 1.1 CPU使用率: top,vmstat (1) 用户CPU使用率:用户态程序的使用率。top 命令 us 字段和 nice字段 (低优先级) (2) 系统CPU使用率:内核态程序的使用率。top 命令 sy 字…...
网络安全基础技术扫盲篇名词解释之“证书“
用通俗易懂的话说: 证书就好比是一张身份证(类似,但不完全相同),用来证明一个网站的身份是否可信。就像你要确认一个陌生人的身份需要看他的身份证一样,电脑在连接一个网站时,也会查看网站的证…...
[数据集][目标检测]老鼠检测数据集VOC+YOLO格式4107张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4107 标注数量(xml文件个数):4107 标注数量(txt文件个数):4107 标注…...
12 FreeRTOS 调试与优化
1、调试 1.1 打印 在FreeRTOS工程中使用了microlib,里面实现了printf函数。 只需要实现一下以下函数即可使用printf。 int fputc(int ch; FILE *f); 假如要从串口实现打印函数: int fputc( int ch, FILE *f ) {//指定串口USART_TypeDef* USARTx USAR…...
【Qt秘籍】[009]-自定义槽函数/信号
自定义槽函数 在Qt中自定义槽函数是一个直接的过程,槽函数本质上是类的一个成员函数,它可以响应信号。所谓的自定义槽函数,实际上操作过程和定义普通的成员函数相似。以下是如何在Qt中定义一个自定义槽函数的步骤: 步骤 1: 定义槽…...
HTTPS加密
一.加密是什么 加密就是把明文(要传输的信息)进行一系列的变换,生成密文. 有加密就有解密,解密就是把密文进行一系列的变换,生成明文. 在这个加密和解密过程中,往往需要一个或多个中间数据,辅助进行这个过程,这样的数据称为密钥. 加密解密到如今已经发展成了一个独立的学科 : 密…...
搭建大型分布式服务(三十八)SpringBoot 整合多个kafka数据源-支持protobuf
系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目,每天处理上亿级的数据的精简小插件,快速上手。 <dependency><groupId>io.github.vipjo…...
SpringBoot如何使用日志Logback,及日志等级详解
Spring Boot默认已经集成了SLF4J(Simple Logging Facade for Java)作为日志的接口,以及Logback作为日志的实现。这意味着在大多数情况下,你无需做额外的配置即可开始记录日志。 下面是一个简要的指南,包括如何在Spring…...
若依启动run-modules-system.bat报错问题解决方案
在启动run-modules-system.bat时遇到了一些问题,在网上搜索无果后,排查解决完毕 1.启动nacos时,报错如下 Error creating bean with name grpcClusterServer: Invocation of init method failed; nested exception is java.io.IOException: Failed to bind to address 0.0.0.0…...
Aws CodeCommit代码仓储库
1 创建IAM用户 IAM创建admin用户,增加AWSCodeCommitFullAccess权限 2 创建存储库 CodePipeline -> CodeCommit -> 存储库 创建存储库 3 SSH 1) window环境 3.1.1 上载SSH公有秘钥 生成SSH秘钥ID 3.1.2 编辑本地 ~/.ssh 目录中名为“config”的 SSH 配置文…...
PostgreSQL的内存参数
PostgreSQL的内存参数 基础信息 OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本:16.2 pg软件目录:/home/pg16/soft pg数据目录:/home/pg16/data 端口:5777PostgreSQL 提供了多种内存参数&#x…...
【教程】在CentOS上使用Docker部署前后端分离项目的完整指南
当在CentOS上使用Docker部署前后端分离项目时,需要遵循一系列步骤来实现这一目标。以下是每个步骤的详细内容: 步骤1:安装Docker和Docker Compose 1.1 安装Docker 在CentOS上安装Docker,可以按照以下步骤进行: sudo yum install -y yum-utils device-mapper-persistent…...
某公司新招了个牛逼的架构师后.....
网友评论: 架构师一个响指之后。第二天,老板不见了走走停停 回头已是数月图片是我的故事没错了,本来我们组有10个人,我把代码重构之后,只要半个人维护,于是老板要裁掉9个>人,于是我被搞走了图…...
云计算和雾计算
雾计算作为传统集中式数据存储系统(云)和边缘设备之间的中间层。雾扩展了云,使计算和数据存储更接近边缘。雾由多个节点(雾节点)组成,并创建一个本地网络,使其成为一个去中心化的生态系统——雾…...
正缘画像 api数据接口
测测正缘画像,相貌特征,高矮胖瘦,黑白美丑,对方何许人也,远嫁近娶,何方定居,家庭观,持家爱家,生活质量,富裕贫穷,健康情况,测算结果仅…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
