Lesson 2 用thread类创建一个线程

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();

猜你喜欢

转载自blog.csdn.net/weixin_39258979/article/details/88038539