关于C++中的多线程(三种创建线程的合集)

这里仅仅是单纯的总结一下C++中的多线程的实际使用方法

多线程

基本概念

多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程。

  • 基于进程的多任务处理是程序的并发执行。
  • 基于线程的多任务处理是同一程序的片段的并发执行。
    多线程程序包含可以同时运行的两个或多个部分,这样的程序中的每个部分成为一个线程,每个线程定义了一个单独的执行路径。
简单实现(此处使用说明的是C++11中的std::thread)

成员类型和成员函数:
在这里插入图片描述
在这里插入图片描述
(1).默认构造函数,创建一个空的 thread 执行对象。
(2).初始化构造函数,创建一个 thread 对象,该 thread 对象可被 joinable,新产生的线程会调用 fn 函数,该函数的参数由 args 给出。
(3).拷贝构造函数(被禁用),意味着 thread 不可被拷贝构造。
(4).move 构造函数,move 构造函数,调用成功之后 x 不代表任何 thread 执行对象。
注意:可被 joinable 的 thread 对象必须在他们销毁之前被主线程 join 或者将其设置为 detached。

一些相关的构造函数及对应的存储位置:

//栈上 
thread t1(show);   //根据函数初始化执行 
thread t2(show); 
thread t3(show); 
//线程数组 
thread th[3]{thread(show), thread(show), thread(show)};  
//堆上 
thread *pt1(new thread(show)); 
thread *pt2(new thread(show)); 
thread *pt3(new thread(show)); 
//线程指针数组 
thread *pth(new thread[3]{thread(show), thread(show), thread(show)});

线程初始化(如下实现了多线程传递参数)

void show(const char *str, const int id)int main() 
{ 
    thread t1(show, "hello!", 0);  //三个参数分别为函数名,以及其两个参数
    thread t2(show, "C++!", 1); 
    return 0; 
} 

join:调用该函数会阻塞当前线程。阻塞调用者(caller)所在的线程直至被join的std::thread对象标识的线程执行结束;

detach:将当前线程对象所代表的执行实例与该线程对象分离,使得线程的执行可以单独进行。一旦线程执行完毕,它所分配的资源将会被释放。

在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
threads.joinable() 判断线程是否可以join ;threads.join();//主线程等待当前线程执行完成再退出 ;
th.detach();//脱离主线程的绑定,主线程挂了,子线程不报错,子线程执行完自动退出。 //detach以后,子线程会成为孤儿线程,线程之间将无法通信。

有时间会把关于C++多线程在整理学习一下,目前整理到此处;一下的参考链接有三种形式的线程开启方式可供选择,待时间稍微宽裕会一一做验证。

参考链接:

1.https://www.cnblogs.com/codingmengmeng/p/5913068.html 该链接为利用Windows系统为我们提供的相关API来自己创建线程的API函数
2.https://www.runoob.com/cplusplus/cpp-multithreading.html
https://blog.csdn.net/hsd2012/article/details/50930236(该方法目前未做验证)
这两个链接为使用 pthread.h 头文件(该文件需下载配置) 来进行线程的创建
3.https://www.cnblogs.com/MCSFX/p/11226627.html
https://www.cnblogs.com/zhang-qc/p/8671248.html
https://blog.csdn.net/liuker888/article/details/46848905
https://blog.csdn.net/fengbingchun/article/details/73393229
该链接就是C++11原生存在的thread类的使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值