C++之多线程(multi-thread)

news/2024/2/28 13:08:09

理论基础

多线程编程是C++中一个重要而复杂的主题。下面是一些建议和步骤,帮助你入门多线程编程:

  1. 了解基础概念:

    线程和进程: 理解线程和进程的基本概念。
    并发和并行: 区分并发和并行的概念,了解它们在多线程编程中的应用。

  2. 学习C++11及以后的线程支持:

    C++11 引入了对多线程编程的支持,包括 std::thread 类等。
    学习如何创建、加入和分离线程。


#include <iostream>
#include <thread>void myFunction() {// 线程执行的函数std::cout << "Hello from thread!" << std::endl;
}int main() {// 创建线程并执行函数std::thread myThread(myFunction);// 等待线程结束myThread.join();return 0;
}
  1. 理解线程同步和互斥:

    互斥锁(Mutex): 学习如何使用 std::mutex 来保护共享资源,防止多个线程同时访问。
    条件变量(Condition Variable): 了解如何使用 std::condition_variable 实现线程间的协同。


#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void worker() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []{ return ready; });// 线程执行的任务std::cout << "Worker thread is done." << std::endl;
}int main() {std::thread myThread(worker);// 准备工作完成后通知线程{std::lock_guard<std::mutex> lock(mtx);ready = true;}cv.notify_one();myThread.join();return 0;
}
  1. 学习原子操作:

    原子操作: 了解如何使用 std::atomic 类型来进行原子操作,避免数据竞争。


#include <iostream>
#include <thread>
#include <atomic>std::atomic<int> counter(0);void increment() {for (int i = 0; i < 1000000; ++i) {counter++;}
}int main() {std::thread t1(increment);std::thread t2(increment);t1.join();t2.join();std::cout << "Counter value: " << counter << std::endl;return 0;
}
  1. 阅读相关书籍和资料:

    《C++ Concurrency in Action》(作者:Anthony Williams):深入讲解C++中的并发编程。
    C++ Multithreading:一个较为详细的在线教程。

  2. 实践多线程编程:

    尝试编写简单的多线程程序,理解线程之间的交互和共享资源的问题。
    解决一些典型的多线程问题,例如生产者-消费者问题等。

  3. 进一步学习:

    了解更高级的主题,如并行算法、任务调度等。
    探索C++标准库中与并发相关的其他组件,如 std::async、std::future 等。

最后的测试实例

#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <chrono>
using namespace std;
std::mutex mtx;  // 互斥锁,用于保护共享资源
int sum = 0;     // 共享资源,存储数组的和// 计算数组的和的函数
void calculateSum(const std::vector<int>& numbers, int start, int end) {int localSum = 0;for (int i = start; i < end; ++i) {localSum += numbers[i];cout << "numbers =" << numbers[i] << endl;std::this_thread::sleep_for(std::chrono::milliseconds(10));}// 使用互斥锁保护对共享资源的访问std::lock_guard<std::mutex> lock(mtx);sum += localSum;cout << "sum =" << sum << endl;
}int main() {// 创建一个包含整数的数组std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 定义线程的数量const int numThreads = 2;// 计算每个线程的工作量const int chunkSize = numbers.size() / numThreads;// 创建线程数组std::vector<std::thread> threads;// 启动线程for (int i = 0; i < numThreads; ++i) {int start = i * chunkSize;int end = (i == numThreads - 1) ? numbers.size() : (i + 1) * chunkSize;threads.emplace_back(calculateSum, std::ref(numbers), start, end);cout << "num threads" << i << endl;}// 等待所有线程完成for (auto& thread : threads) {thread.join();}// 输出最终的结果std::cout << "Sum of the array: " << sum << std::endl;return 0;
}

http://www.ppmy.cn/news/1350046.html

相关文章

没更新的日子也在努力呀,布局2024!

文章目录 ⭐ 没更新的日子也在努力呀⭐ 近期的一个状态 - 已圆满⭐ 又到了2024的许愿时间了⭐ 开发者要如何去 "创富" ⭐ 没更新的日子也在努力呀 感觉很久没有更新视频了&#xff0c;好吧&#xff0c;其实真的很久没有更新短视频了。最近的一两个月真的太忙了&#…

第一章、APPium、android自动化

第一章、APPium、android自动化 第二章、android利用QPython环境调用APPium 环境搭建 1、android studio 配置SDK Manger 的sdk、ndk、adb 控制台输入 open -e /Users/shenjianbin/.bash_profile.save export ANDROID_SDK/Users/shenjianbin/Library/Android/sdk export PA…

OCP使用web console创建和构建应用

文章目录 环境登录创建project赋予查看权限部署第一个image检查pod扩展应用 部署一个Python应用连接数据库创建secret加载数据并显示国家公园地图 清理参考 环境 RHEL 9.3Red Hat OpenShift Local 2.32 登录 在 crc start 启动crc时&#xff0c;可以看到&#xff1a; .....…

ClickHouse--02--安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 安装官网 &#xff1b;[https://clickhouse.com/docs/zh/getting-started/install](https://clickhouse.com/docs/zh/getting-started/install)![在这里插入图片描述…

中国电子学会2020年9月份青少年软件编程Scratch图形化等级考试试卷三级真题(编程题)

编程题(共3题&#xff0c;共30分) 36.题目&#xff1a;魔术表演“开花” 1.准备工作 &#xff08;1&#xff09;将舞台设置为"Party"&#xff1b; &#xff08;2&#xff09;删除默认角色&#xff0c;自行绘制椭圆花瓣角色&#xff1b; &#xff08;3&#xf…

C++ | KMP算法模板

next数组初始化 char a[1000006];//原串 char p[1000006];//子串 int pmt[1000006];void getNext(int m){int j0;pmt[0]0;for(int i1;i<m;i){while(j>0 && p[i]!p[j])jpmt[j-1];if(p[i]p[j])j;pmt[i]j;} }以下实例基于上述getNext函数及数据结构执行&#xff1a…

Flink从入门到实践(三):数据实时采集 - Flink MySQL CDC

文章目录 系列文章索引一、概述1、版本匹配2、导包 二、编码实现1、基本使用2、更多配置3、自定义序列化器4、Flink SQL方式 三、踩坑1、The MySQL server has a timezone offset (0 seconds ahead of UTC) which does not match the configured timezone Asia/Shanghai. 参考资…

【JVM篇】ThreadLocal中为什么要使用弱引用

文章目录 &#x1f354;ThreadLocal中为什么要使用弱引用⭐总结 &#x1f354;ThreadLocal中为什么要使用弱引用 ThreadLocal可以在线程中存放线程的本地变量&#xff0c;保证数据的线程安全 ThreadLocal是这样子保存对象的&#xff1a; 在每个线程中&#xff0c;存放了一个…

notepad++成功安装后默认显示英文怎么设置中文界面?

前几天使用电脑华为管家清理电脑后&#xff0c;发现一直使用的notepad软件变回了英文界面&#xff0c;跟刚成功安装的时候一样&#xff0c;那么应该怎么设置为中文界面呢&#xff1f;具体操作如下&#xff1a; 1、打开notepad软件&#xff0c;点击菜单栏“Settings – Prefere…

嵌入式linux驱动开发之网络设备驱动

https://bbs.csdn.net/topics/612247295 简介 Linux网络设备驱动是Linux内核中的一个重要组成部分&#xff0c;它负责网络设备的底层数据传输和设备控制。与字符设备驱动和块设备驱动相比&#xff0c;网络设备驱动的特点和功能如下&#xff1a; 首先&#xff0c;网络设备驱动…

单片机与外设的交互

单片机与外设的交互是嵌入式系统中非常重要的一个基础知识点。单片机是一个集成在同一芯片上的中央处理器、存储器和输入/输出接口,它可以根据用户编写的程序与各种外部设备即外设进行交互。单片机与外设之间的交互主要通过单片机上的输入/输出口(I/O口)来实现。 I/O口的工作原…

类和对象——封装

师从黑马程序员 封装 封装的意义一 在设计类的时候&#xff0c;属性和行为写在一起&#xff0c;表现事物 语法&#xff1a; class 类名{ 访问权限&#xff1a;属性/行为 }&#xff1b; 设计一个圆类&#xff0c;求圆的周长 代码&#xff1a; 示例1&#xff1a; #inc…

【EAI 015】CLIPort: What and Where Pathways for Robotic Manipulation

论文标题&#xff1a;CLIPort: What and Where Pathways for Robotic Manipulation 论文作者&#xff1a;Mohit Shridhar1, Lucas Manuelli, Dieter Fox1 作者单位&#xff1a;University of Washington, NVIDIA 论文原文&#xff1a;https://arxiv.org/abs/2109.12098 论文出处…

安装opencart

一、安装模板 Install SO Emarket Opencart 4 Theme 一&#xff1a;so_emarket_quick2 二&#xff1a;theme package installation 1、installed opencart Default 2、Extensions->Installer->Upload->so_emarket_theme_oc4011_home21_to_home35_v2.0.3->so_theme…

奶茶点餐|奶茶店自助点餐系统|基于微信小程序的饮品点单系统的设计与实现(源码+数据库+文档)

奶茶店自助点餐系统目录 目录 基于微信小程序的饮品点单系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、商品信息管理 2、商品评价管理 3、商品订单管理 4、用户管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 …

CSS Selector—选择方法,和html自动——异步社区的爬取(动态网页)——爬虫(get和post的区别)

这里先说一下GET请求和POST请求&#xff1a; post我们平时是要加data的也就是信息&#xff0c;你会发现我们平时百度之类的 搜索都是post请求 get我们带的是params&#xff0c;是发送我们指定的内容。 要注意是get和post请求&#xff01;&#xff01;&#xff01; 先说一下异…

跟着cherno手搓游戏引擎【24】开启2D引擎前的项目总结(包括前置知识汇总)

前置技术&#xff1a; vs属性解释&#xff1a; MSBuild的入门完整教程&#xff08;包学包会&#xff09;-CSDN博客 配置界面&#xff1a; c动态链接和静态链接&#xff1a; 隐藏的细节&#xff1a;编译与链接_哔哩哔哩_bilibili 【底层】动态链接库(dll)是如何工作的&…

基于微信小程序的在线课堂的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

FTP服务简介(工作原理、连接模式、流行服务器软件)

FTP&#xff08;File Transfer Protocol&#xff0c;文件传输服务&#xff09;提供在Internet上的任意两台计算机之间相互进行的文件传输。只要双方主机都支持FTP协议&#xff0c;就可以利用FTP来进行文件传输。 工作原理 FTP服务是客户/服务器模式&#xff0c;用户通过客户机…

[C#] 如何使用ScottPlot.WPF在WPF桌面程序中绘制图表

什么是ScottPlot.WPF&#xff1f; ScottPlot.WPF 是一个开源的数据可视化库&#xff0c;用于在 WPF 应用程序中创建高品质的绘图和图表。它是基于 ScottPlot 库的 WPF 版本&#xff0c;提供了简单易用的 API&#xff0c;使开发人员能够通过简单的代码创建各种类型的图表&#…
最新文章