news 2026/6/23 16:43:39

【20天学C++】Day 19: 多线程编程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【20天学C++】Day 19: 多线程编程

【20天学C++】Day 19: 多线程编程

📅 学习时间:4-5小时
🎯 学习目标:掌握C++多线程基础
💡 难度:★★★★☆


1. 线程基础

1.1 创建线程

#include<iostream>#include<thread>usingnamespacestd;// 线程函数voidhello(){cout<<"Hello from thread!"<<endl;}voidprintNumber(intn){for(inti=0;i<n;i++){cout<<i<<" ";}cout<<endl;}intmain(){// 创建线程threadt1(hello);// 带参数threadt2(printNumber,5);// Lambdathreadt3([](){cout<<"Lambda thread"<<endl;});// 等待线程结束t1.join();t2.join();t3.join();cout<<"主线程结束"<<endl;return0;}

1.2 join和detach

#include<iostream>#include<thread>#include<chrono>usingnamespacestd;voidwork(intseconds){this_thread::sleep_for(chrono::seconds(seconds));cout<<"工作完成,耗时"<<seconds<<"秒"<<endl;}intmain(){threadt1(work,2);// join:等待线程结束t1.join();// 主线程阻塞,直到t1结束threadt2(work,3);// detach:分离线程(后台运行)t2.detach();// 注意:主线程结束后,t2可能还没完成// 必须join或detach,否则析构时会terminate// thread t3(work, 1); // ❌ 没有join或detachcout<<"主线程继续"<<endl;this_thread::sleep_for(chrono::seconds(4));// 等待detach的线程return0;}

1.3 线程信息

#include<iostream>#include<thread>usingnamespacestd;intmain(){// 获取线程IDcout<<"主线程ID: "<<this_thread::get_id()<<endl;threadt([](){cout<<"子线程ID: "<<this_thread::get_id()<<endl;});cout<<"t的ID: "<<t.get_id()<<endl;// 硬件并发数cout<<"CPU核心数: "<<thread::hardware_concurrency()<<endl;t.join();return0;}

2. 互斥锁

2.1 mutex基础

#include<iostream>#include<thread>#include<mutex>usingnamespacestd;intcounter=0;mutex mtx;voidincrement(){for(inti=0;i<100000;i++){mtx.lock();// 加锁counter++;mtx.unlock();// 解锁}}intmain(){threadt1(increment);threadt2(increment);t1.join();t2.join();cout<<"counter = "<<counter<<endl;// 200000return0;}

2.2 lock_guard(RAII)

#include<iostream>#include<thread>#include<mutex>usingnamespacestd;intcounter=0;mutex mtx;voidincrement(){for(inti=0;i<100000;i++){// lock_guard:自动加锁解锁lock_guard<mutex>lock(mtx);counter++;// 作用域结束自动解锁}}intmain(){threadt1(increment);threadt2(increment);t1.join();t2.join();cout<<"counter = "<<counter<<endl;return0;}

2.3 unique_lock

#include<iostream>#include<thread>#include<mutex>usingnamespacestd;mutex mtx;voidflexible(){// unique_lock更灵活unique_lock<mutex>lock(mtx);// 可以手动解锁lock.unlock();// 可以重新加锁lock.lock();// 可以尝试加锁if(lock.try_lock()){// 成功}// 可以转移所有权unique_lock<mutex>lock2=move(lock);}intmain(){threadt(flexible);t.join();return0;}

3. 条件变量

#include<iostream>#include<thread>#include<mutex>#include<condition_variable>#include<queue>usingnamespacestd;queue<int>dataQueue;mutex mtx;condition_variable cv;boolfinished=false;voidproducer(){for(inti=1;i<=10;i++){{lock_guard<mutex>lock(mtx);dataQueue.push(i);cout<<"生产: "<<i<<endl;}cv.notify_one();// 通知消费者this_thread::sleep_for(chrono::milliseconds(100));}{lock_guard<mutex>lock(mtx);finished=true;}cv.notify_all();}voidconsumer(){while(true){unique_lock<mutex>lock(mtx);// 等待条件:队列非空或已结束cv.wait(lock,[](){return!dataQueue.empty()||finished;});while(!dataQueue.empty()){intdata=dataQueue.front();dataQueue.pop();cout<<"消费: "<<data<<endl;}if(finished&&dataQueue.empty())break;}}intmain(){threadprod(producer);threadcons(consumer);prod.join();cons.join();return0;}

4. 原子操作

#include<iostream>#include<thread>#include<atomic>usingnamespacestd;atomic<int>counter(0);// 原子变量voidincrement(){for(inti=0;i<100000;i++){counter++;// 原子操作,无需加锁}}intmain(){threadt1(increment);threadt2(increment);t1.join();t2.join();cout<<"counter = "<<counter<<endl;// 200000// 原子操作atomic<int>a(10);a.store(20);// 存储intval=a.load();// 读取intold=a.exchange(30);// 交换// CAS操作intexpected=30;a.compare_exchange_strong(expected,40);return0;}

5. async和future

#include<iostream>#include<future>#include<chrono>usingnamespacestd;intcompute(intx){this_thread::sleep_for(chrono::seconds(2));returnx*x;}intmain(){// async:异步执行future<int>result=async(launch::async,compute,10);cout<<"计算中..."<<endl;// get():获取结果(阻塞直到完成)intvalue=result.get();cout<<"结果: "<<value<<endl;// 多个异步任务autof1=async(launch::async,compute,5);autof2=async(launch::async,compute,10);autof3=async(launch::async,compute,15);cout<<f1.get()+f2.get()+f3.get()<<endl;return0;}

5.1 promise

#include<iostream>#include<thread>#include<future>usingnamespacestd;voidworker(promise<int>&prom){// 做一些工作this_thread::sleep_for(chrono::seconds(1));// 设置结果prom.set_value(42);}intmain(){promise<int>prom;future<int>fut=prom.get_future();threadt(worker,ref(prom));cout<<"等待结果..."<<endl;intresult=fut.get();cout<<"结果: "<<result<<endl;t.join();return0;}

6. 线程安全的单例

#include<iostream>#include<mutex>usingnamespacestd;classSingleton{private:staticSingleton*instance;staticonce_flag flag;Singleton(){cout<<"创建单例"<<endl;}public:staticSingleton*getInstance(){call_once(flag,[](){instance=newSingleton();});returninstance;}};Singleton*Singleton::instance=nullptr;once_flag Singleton::flag;// 更简单的方式(C++11保证线程安全)classSingleton2{Singleton2(){}public:staticSingleton2&getInstance(){staticSingleton2 instance;// 线程安全returninstance;}};intmain(){autos1=Singleton::getInstance();autos2=Singleton::getInstance();cout<<(s1==s2)<<endl;// 1return0;}

7. 小结

[线程基础] 1. thread创建线程 2. join()等待线程 3. detach()分离线程 [同步原语] 4. mutex互斥锁 5. lock_guard自动锁 6. unique_lock灵活锁 7. condition_variable条件变量 [原子操作] 8. atomic<T>原子类型 9. 无锁编程 [异步] 10. async异步执行 11. future获取结果 12. promise设置结果 [线程安全] 13. call_once单次执行 14. 静态局部变量单例

下一篇预告:Day 20 - 综合项目与进阶


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 10:43:58

【30天精通汇编】Day 1: 计算机基础与二进制

【30天精通汇编】Day 1: 计算机基础与二进制&#x1f4c5; 学习时间&#xff1a;3-4小时 &#x1f3af; 学习目标&#xff1a;理解计算机底层原理&#xff0c;掌握二进制运算 &#x1f4a1; 难度&#xff1a;★☆☆☆☆ &#x1f4cb; 前置要求&#xff1a;零基础可学&#x1f…

作者头像 李华
网站建设 2026/6/22 8:15:51

探秘《Hands on Large Language Models》:开启大模型学习之旅(附教程)

今天要给大家介绍一本在大语言模型领域超有分量的新书 ——《Hands on Large Language Models》。目前已经正式发布&#xff0c;干货满满&#xff0c;绝对能让你抢先一步深入大语言模型的奇妙世界。 当大语言模型遇上 “实战指南” 这几年&#xff0c;大语言模型那可是火得一塌…

作者头像 李华
网站建设 2026/6/22 8:15:15

降AI工具安全吗?论文会被收录吗?2026年隐私保护指南

降AI工具安全吗&#xff1f;论文会被收录吗&#xff1f;2026年隐私保护指南 用降AI工具处理论文&#xff0c;安全吗&#xff1f;会不会被收录到数据库&#xff1f; 这是很多同学担心的问题。毕竟论文是自己的心血&#xff0c;万一被泄露或收录就麻烦了。 这篇文章帮你搞清楚…

作者头像 李华
网站建设 2026/6/22 8:17:50

下载与快速上手 NVM:Node.js 版本管理工具

一、准备工作&#xff1a;卸载旧版 Node.js 重要提示&#xff1a;在安装 NVM 前&#xff0c;请先彻底删除已安装的 Node.js&#xff0c;避免路径冲突&#xff1a;检查安装路径where node常见路径&#xff1a;C:\Program Files\nodejs\ C:\Users\用户名\AppData\Local\nodejs\卸…

作者头像 李华
网站建设 2026/6/22 0:41:57

2026年最新降AI攻略总结:一站搞定论文AIGC检测

2026年最新降AI攻略总结&#xff1a;一站搞定论文AIGC检测 这篇文章是2026年降AI攻略的终极总结。 如果你只想看结论&#xff0c;直接拉到最后。如果想了解细节&#xff0c;继续往下看。 2026年AIGC检测现状 检测平台&#xff1a;知网、维普、万方 红线标准&#xff1a; 本…

作者头像 李华
网站建设 2026/6/15 19:08:04

DeepSeek+豆包+Kimi降AI指令有用吗?2026年实测告诉你真相

DeepSeek豆包Kimi降AI指令有用吗&#xff1f;2026年实测告诉你真相 网上流传着很多"降AI指令"&#xff0c;说用DeepSeek、豆包、Kimi就能把AI率降下来。 我认真测试了一下&#xff0c;结论是&#xff1a;有一定效果&#xff0c;但很有限。 想把AI率从60%降到10%以…

作者头像 李华