这里仅仅是单纯的总结一下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类的使用