文章目录
- 线程运行的开始和结束
- 写一个自己的线程:
- 上面看到了几行新代码,介绍一下:
线程运行的开始和结束
主线程是从main主函数开始执行的,自己创建的线程也得从一个函数(初始函数)开始执行。一旦这个函数执行完毕,那么自己创建的这个线程也就运行结束了。
写一个自己的线程:
- 在MyProject.cpp文件开始位置要#include一个头文件,这个头文件里包含了创建线程有关的函数声明信息:
#include<thread>
- 程序员创建的线程要从myprint函数开始运行,所以先完成这个函数:
//自己创建一个线程也是从函数开始运行
void myprint
{cout<<"我的线程开始执行了"<<endl;//......cout<<"我的线程执行完毕了"<<endl;return;
}
- 在main主函数中,加入如下代码:
std::thread mytobj(myprint);//这就是创建线程的代码,给的参数是一个函数名
mytobj.join();
cout<<"main主函数执行结束!"<<endl;
执行起来,看一看结果:
我的线程开始执行了
我的线程执行完毕了
main主函数执行结束!
有两个线程在跑,相当于这个程序的执行有两条线在同时走,所以它可以同时做两件事情,即使一条线被堵住了,另外一条线还是可以通行,这就是多线程
上面看到了几行新代码,介绍一下:
- thread。
std::thread mytobj(myprint);
thread是C++标准库里面的类,这个类就是用来创建线程的。里面是一个可调用对象作为thread构造函数的实参来构造这个thread对象。
- join。
mytobj.join();
join成员函数的功能是:用来等待myprint函数(线程的入口函数)运行完成。一旦执行了join这行代码,主线程就阻塞到这一行,等待mytobj对象所代表的线程执行完毕,也就是等待myprint函数执行完毕。
一个书写良好的程序,应该是主线程等待子线程执行完毕后,自己才能最终退出。
- detach。
主线程有义务等待所有子线程执行完毕后,自己才能最终退出。这是传统的多线程程序的写法。
但是随着语言的发展,也看到了打破传统的一些程序写法,这就是现在要介绍的detach成员函数。翻译成中文,detach是“分离”的意思。所谓分离,就是主线程不和子线程汇合了,主线程执行主线程的,子线程执行子线程的,主线程不必等子线程运行结束,可以先执行结束,这并不影响子线程的执行。 - joinable。
判断是否可以成功使用join或者detach。如果在main主函数中,只有如下这样一条代码:
thread mytobj(myprint);
那么此时此刻,joinable返回的是true:
cout<<mytobj.joinable()<<endl;//1
但是如果随后调用了join或者detach,那么joinable会变成false。
所以,joinable有一定的用处—判断针对某个线程是否调用过join或者detach