版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39258979/article/details/88038539
引入:我们都知道一个程序的入口在主函数main开始,那么作为线程也应该有一个自己入口函数。创建一个线程第一步就是要创建一个自己的入口函数。
一、std::thread 类模板
和使用std::string引用头文件#include <string>
一样,使用thread童谣要引用头文件#include <thread>
,使用类模板,只需要传入合适的参数(函数、类的成员函数地址),即可创建一个thread类。
有了thread类,就可以使用它们对应的方法(join/detach/joinable/detachable)。
二、std::thread成员函数介绍
2.1 join()成员函数
如果显式调用这个成员函数,意味着我们的主线程将会等待子线程执行完毕后才继续执行,即我们所说的阻塞。
2.2 detach()成员函数
如果显式调用这个函数,意味着主线程将会继续执行,子线程将会交由C++ 运行时库接管。也就是说,分离了主线程和子线程的依赖关系。
2.3 joinable()成员函数
如果线程是可以阻塞的,我们返回true,反之返回false
2.4 detachable()成员函数
如果线程是可以被分离的,我们返回true,反之返回false
2.5 std::thread命名空间下的常用函数
在对应线程中使用下面函数即可产生相应的效果
- std::thread::get_id() 获取当前的thread的id
- std::thread::sleep_for() 休眠相应时间
第二个通常结合std::chrono::milliseconds使用。下面语句执行会使线程休眠5秒,然后继续执行线程。
std::chrono::milliseconds dura(5000);
std::this_thread::sleep_for(dura);
二、thread类的创建
这里只讨论无参入口函数。
2.1 普通函数作为入口函数
thread只需要传入函数名。
void mythread()
{
cout<<"running"<<endl;
}
int main()
{
std::thread t1(mythread);//入口为mythread的线程t1
t1.join();//阻塞以防止主线程早于t1线程退出造成崩溃
return 0;
}
2.2 类的成员函数作为入口函数
thread不仅需要成员函数属于哪个类,还要指明对象实例。
class A
{
public:
void class_mythread()
{
cout<<"class function runnig"<<endl;
}
};
int main()
{
A apple;
std::thread t2(&A::class_mythread,apple);
t2.join();
return 0;
}
2.3 类中可调用对象作为入口函数
class A
{
public:
void operator()()
{
cout<<"class function runnig"<<endl;
}
};
int main()
{
A apple;
std::thread t3(apple);
t3.join();
return 0;
}
2.4 lambada表达式作为线程入口函数
std::thread t4([]{cout<<"lambada runnig"<<endl;});
t4.join();