C++多线程的6种创建方法
配合B站视频看添加链接描述
1. 并发、进程、线程概念:
在这里插入图片描述
2 创建线程:
普通函数方法创建线程
包含头文件,调用thread类创建一个线程对象;
#include <thread> #include <iostream> using namespace std; void print(){ cout<<"子线程"<<endl; } int main(){ thread test1(print); cout<<"主线程"<<endl; return 0; }
此时,执行代码会出错,会调用abort 函数终止程序。
需要使用join 函数,详解join 和detach函数,汇合线程,阻塞主线程。
#include <thread> #include <iostream> #include <windows.h> using namespace std; void print(){ Sleep(5000);//5m cout<<"子线程"<<endl; } int main(){ thread test1(print); test1.join();//阻塞 cout<<"主线程"<<endl; return 0; }
执行程序,5s后显示:
#include <thread> #include <iostream> #include <windows.h> using namespace std; void print1(){ Sleep(5000);//5m cout<<"子线程"<<endl; } void print2(){ Sleep(5000);//5m cout<<"子线程"<<endl; } int main(){ thread test1(print1); thread test2(print2); test1.join();//阻塞 test2.join();//阻塞 cout<<"主线程"<<endl; return 0; }
等5s,窗口显示:
因为这两个线程互不影响。
#include <thread> #include <iostream> #include <windows.h> using namespace std; void print(){ Sleep(5000);//5m cout<<"子线程"<<endl; } int main(){ thread test1(print); test1.detch();// cout<<"主线程"<<endl; return 0; }
则窗口显示为:
因为子线程和主线程互不影响,主线程执行完了,子线程还没执行完。(子线程驻留后台)。
当线程detch 后就不能join 了。
joinable函数,判断当前线程是否可以做join 或者detch,可以返回真,不可以返回假。
#include <thread> #include <iostream> #include <windows.h> using namespace std; void print(){ Sleep(5000);//5m cout<<"子线程"<<endl; } int main(){ thread test1(print); test1.detch();// cout<<"主线程"<<endl; if(test1.joinable()){ test1.detch(); } else cout<<"子线程已被处理"<<endl; return 0; }
窗口显示为:
通过类和对象创建线程
#include <thread> #include <iostream> #include <windows.h> using namespace std; class MM{ public: void operator()(){//重载() cout<<"子线程启动"<<endl; } }; int main(){ MM mm;//对象充当线程处理函数 thread test1(mm); //上面也可以写成: //thread test1((MM()))//创建无名对象。MM()外要加括号,防止解析为函数。 test1.join();// cout<<"ILOVEYOU"<<endl; return 0; }
Lambda表达式创建
带参的方式创建
#include <iostream> #include <thread> using namespace std; void printInfo(int & num){ cout<<"线程号为"<<num<<endl; } int main(){ int num=0; thread test1(printInfo,num);//此行有问题 test1.join(); cout<<"主线程"<<endl; return 0; }
此时编译则报错,需要将有问题的那行改为
thread test1(printInfo,std::ref(num)); //std::ref用于包装引用传递值;
这样就没错了;
智能指针创建
move :移动语义。
类的成员函数创建
&MM::print可以获取Print 的函数地址。
多线程中数据混乱问题
假设有 4 个线程 A、B、C、D,当前一个线程 A 对内存中的共享资源进行访问的时候,其他线程 B, C, D 都不可以对这块内存进行操作,直到线程 A 对这块内存访问完毕为止,B,C,D 中的一个才能访问这块内存----线程同步的概念。
发现一个C++多线程 的宝藏博客:添加链接描述
本文来自博客园,作者:开源侠,转载请注明原文链接:https://www.cnblogs.com/cyj22/p/17943407
微信公众号:青衫换酒吃
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本