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

C++11 在 Windows 环境下的多线程编程指南

引言

随着多核处理器的普及,利用多线程编程来提升应用程序性能变得越来越重要。C++11 标准库引入了一系列用于多线程编程的API,使得多线程编程变得更加简洁和高效。

一、基本概念

在开始编写多线程代码之前,了解一些基本概念是非常重要的:

  1. 线程:线程是操作系统能够调度的最小执行单元。一个进程可以包含多个线程,这些线程共享进程的资源,但可以独立执行。
  2. 并行和并发:并行是指多个线程同时执行,而并发是指多个线程在同一时间段内交替执行。

二、创建和管理线程

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_guardstd::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::asyncstd::future 等工具,我们可以轻松地实现异步编程。这些工具不仅适用于Windows环境,也适用于其他平台,使得我们的代码具有良好的可移植性。

更多详细代码:C++11多线程编程: Windows下C++11多线程编程

相关文章:

C++11 在 Windows 环境下的多线程编程指南

引言 随着多核处理器的普及&#xff0c;利用多线程编程来提升应用程序性能变得越来越重要。C11 标准库引入了一系列用于多线程编程的API&#xff0c;使得多线程编程变得更加简洁和高效。 一、基本概念 在开始编写多线程代码之前&#xff0c;了解一些基本概念是非常重要的&am…...

[数据集][目标检测]旋风检测数据集VOC+YOLO格式157张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;159 标注数量(xml文件个数)&#xff1a;159 标注数量(txt文件个数)&#xff1a;159 标注类别…...

智慧商砼搅拌车安监运营管理的创新实践

随着城市化进程的加速&#xff0c;商砼搅拌车作为城市建设的重要设备&#xff0c;其安全管理与运营效率直接关系到工程质量和施工进度。近年来&#xff0c;通过引入先进的4G无线视频智能车载终端套件&#xff0c;我们实现了对商砼搅拌车的高精度定位、实时音视频调度、实时油量…...

渗透测试框架提权

Metasploit自动提权 Meterpreter自动提权命令 getsystem&#xff1a; getsystem是由Metasploit-Framework提供的一个模块&#xff0c;它可以将一个管理帐户&#xff08;通常为本地Administrator账户&#xff09;提升为本地SYSTEM帐户 1)getsystem创建一个新的Windows服务&…...

tcp链接中的三次挥手是什么原因

一、tcp链接中的正常四次挥手过程&#xff1f; 刚开始双方都处于 ESTABLISHED 状态&#xff0c;假如是客户端先发起关闭请求。四次挥手的过程如下&#xff1a; 1、客户端打算关闭连接&#xff0c;此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文&#xff0c;也即 FIN 报文…...

运维相关知识

一、运维需要关注 服务器的哪些数据&#xff1f; 1. CPU 1.1 CPU使用率&#xff1a; top&#xff0c;vmstat (1) 用户CPU使用率&#xff1a;用户态程序的使用率。top 命令 us 字段和 nice字段 (低优先级) (2) 系统CPU使用率&#xff1a;内核态程序的使用率。top 命令 sy 字…...

网络安全基础技术扫盲篇名词解释之“证书“

用通俗易懂的话说&#xff1a; 证书就好比是一张身份证&#xff08;类似&#xff0c;但不完全相同&#xff09;&#xff0c;用来证明一个网站的身份是否可信。就像你要确认一个陌生人的身份需要看他的身份证一样&#xff0c;电脑在连接一个网站时&#xff0c;也会查看网站的证…...

[数据集][目标检测]老鼠检测数据集VOC+YOLO格式4107张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4107 标注数量(xml文件个数)&#xff1a;4107 标注数量(txt文件个数)&#xff1a;4107 标注…...

12 FreeRTOS 调试与优化

1、调试 1.1 打印 在FreeRTOS工程中使用了microlib&#xff0c;里面实现了printf函数。 只需要实现一下以下函数即可使用printf。 int fputc(int ch; FILE *f); 假如要从串口实现打印函数&#xff1a; int fputc( int ch, FILE *f ) {//指定串口USART_TypeDef* USARTx USAR…...

【Qt秘籍】[009]-自定义槽函数/信号

自定义槽函数 在Qt中自定义槽函数是一个直接的过程&#xff0c;槽函数本质上是类的一个成员函数&#xff0c;它可以响应信号。所谓的自定义槽函数&#xff0c;实际上操作过程和定义普通的成员函数相似。以下是如何在Qt中定义一个自定义槽函数的步骤&#xff1a; 步骤 1: 定义槽…...

HTTPS加密

一.加密是什么 加密就是把明文(要传输的信息)进行一系列的变换,生成密文. 有加密就有解密,解密就是把密文进行一系列的变换,生成明文. 在这个加密和解密过程中,往往需要一个或多个中间数据,辅助进行这个过程,这样的数据称为密钥. 加密解密到如今已经发展成了一个独立的学科 : 密…...

搭建大型分布式服务(三十八)SpringBoot 整合多个kafka数据源-支持protobuf

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…...

SpringBoot如何使用日志Logback,及日志等级详解

Spring Boot默认已经集成了SLF4J&#xff08;Simple Logging Facade for Java&#xff09;作为日志的接口&#xff0c;以及Logback作为日志的实现。这意味着在大多数情况下&#xff0c;你无需做额外的配置即可开始记录日志。 下面是一个简要的指南&#xff0c;包括如何在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用户&#xff0c;增加AWSCodeCommitFullAccess权限 2 创建存储库 CodePipeline -> CodeCommit -> 存储库 创建存储库 3 SSH 1) window环境 3.1.1 上载SSH公有秘钥 生成SSH秘钥ID 3.1.2 编辑本地 ~/.ssh 目录中名为“config”的 SSH 配置文…...

PostgreSQL的内存参数

PostgreSQL的内存参数 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777PostgreSQL 提供了多种内存参数&#x…...

【教程】在CentOS上使用Docker部署前后端分离项目的完整指南

当在CentOS上使用Docker部署前后端分离项目时,需要遵循一系列步骤来实现这一目标。以下是每个步骤的详细内容: 步骤1:安装Docker和Docker Compose 1.1 安装Docker 在CentOS上安装Docker,可以按照以下步骤进行: sudo yum install -y yum-utils device-mapper-persistent…...

某公司新招了个牛逼的架构师后.....

网友评论&#xff1a; 架构师一个响指之后。第二天&#xff0c;老板不见了走走停停 回头已是数月图片是我的故事没错了&#xff0c;本来我们组有10个人&#xff0c;我把代码重构之后&#xff0c;只要半个人维护&#xff0c;于是老板要裁掉9个>人&#xff0c;于是我被搞走了图…...

云计算和雾计算

雾计算作为传统集中式数据存储系统&#xff08;云&#xff09;和边缘设备之间的中间层。雾扩展了云&#xff0c;使计算和数据存储更接近边缘。雾由多个节点&#xff08;雾节点&#xff09;组成&#xff0c;并创建一个本地网络&#xff0c;使其成为一个去中心化的生态系统——雾…...

正缘画像 api数据接口

测测正缘画像&#xff0c;相貌特征&#xff0c;高矮胖瘦&#xff0c;黑白美丑&#xff0c;对方何许人也&#xff0c;远嫁近娶&#xff0c;何方定居&#xff0c;家庭观&#xff0c;持家爱家&#xff0c;生活质量&#xff0c;富裕贫穷&#xff0c;健康情况&#xff0c;测算结果仅…...

AI巨头集体“铸Token”:从ChatGPT到“数字员工工厂”,程序员的狂欢还是危机?

想象一下&#xff1a;你早上醒来&#xff0c;打开电脑&#xff0c;不是自己敲代码&#xff0c;而是对着一只“龙虾”说&#xff1a;“帮我把昨天的Bug修了&#xff0c;顺便给老板发份周报。” 这不是科幻——2026年3月&#xff0c;这事儿正在发生。 全球头部科技公司突然集体“…...

如何高效配置Unity插件框架:BepInEx完整实战指南

如何高效配置Unity插件框架&#xff1a;BepInEx完整实战指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款专为Unity游戏设计的插件框架和补丁工具&#xff0c;能够…...

OpenClaw错误排查大全:百川2-13B接口调用常见问题与解决方案

OpenClaw错误排查大全&#xff1a;百川2-13B接口调用常见问题与解决方案 1. 为什么需要这份排查指南 上周我在本地部署百川2-13B模型对接OpenClaw时&#xff0c;连续遇到了三个晚上各种报错。从模型加载失败到Token耗尽&#xff0c;再到莫名其妙的响应超时&#xff0c;每次解…...

第一步:你只需要改这里的所有参数

算数优化算法AOA&#xff0c;2021年新出的智能优化算法&#xff0c;结合SVM做回归拟合预测建模&#xff0c;代码内有详细的注释替换数据就可以使用上次实验室熬大夜调催化加氢产率的SVR模型差点怀疑人生&#xff1a;RBF核随便蒙C和gamma&#xff0c;MSE有时候0.01有时候飘到0.5…...

从单体到微服务:用Ruoyi-Vue-Plus框架快速搭建多租户后台系统(含AI模块开发避坑指南)

从单体到微服务&#xff1a;Ruoyi-Vue-Plus框架的多租户实战与AI模块开发精要 当企业级应用需要同时服务多个客户群体时&#xff0c;如何确保数据隔离与系统性能的平衡成为架构设计的核心挑战。Ruoyi-Vue-Plus作为一款基于Spring Boot的快速开发框架&#xff0c;其多租户实现机…...

Llama-3.2V-11B-cot入门必看:Streamlit组件热重载加速UI迭代开发

Llama-3.2V-11B-cot入门必看&#xff1a;Streamlit组件热重载加速UI迭代开发 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B多模态大模型开发的高性能视觉推理工具&#xff0c;专为双卡4090环境深度优化。该工具通过Streamlit框架构建了直观易用的交互界面&#…...

Qwen3-ForcedAligner-0.6B生产环境:支持日均1000+分钟音频批处理任务

Qwen3-ForcedAligner-0.6B生产环境&#xff1a;支持日均1000分钟音频批处理任务 1. 项目概述 Qwen3-ForcedAligner-0.6B是一款基于阿里巴巴先进语音识别技术开发的本地化智能语音转录工具。该工具采用双模型架构设计&#xff0c;集成了Qwen3-ASR-1.7B语音识别模型和ForcedAli…...

终极指南:如何使用Rainmeter构建内存使用趋势预测模型(ARIMA/SVM应用)

终极指南&#xff1a;如何使用Rainmeter构建内存使用趋势预测模型&#xff08;ARIMA/SVM应用&#xff09; 【免费下载链接】rainmeter Desktop customization tool for Windows 项目地址: https://gitcode.com/gh_mirrors/ra/rainmeter Rainmeter作为一款强大的Windows桌…...

Vue 3 Fragments:打破枷锁的组件化革命

Vue 3 Fragments&#xff1a;打破枷锁的组件化革命 在前端框架的演进史上&#xff0c;每一次对底层限制的突破&#xff0c;往往都伴随着开发体验的质的飞跃。Vue 3 中引入的 Fragments&#xff08;片段&#xff09; 特性&#xff0c;正是这样一场迟来的“解绑”革命。它彻底粉碎…...

VMware虚拟机安装Ubuntu教程:创建独立的Qwen3-14B-AWQ模型测试环境

VMware虚拟机安装Ubuntu教程&#xff1a;创建独立的Qwen3-14B-AWQ模型测试环境 1. 为什么需要虚拟机测试环境 在测试大语言模型时&#xff0c;使用虚拟机可以避免污染宿主机环境。特别是像Qwen3-14B-AWQ这样的模型&#xff0c;依赖项复杂&#xff0c;直接在主机上安装可能会与…...