C++11特性-线程

并发 

        一个程序执行多个独立任务,提高性能

        单核cpu是通过(任务切换),即上下文切换,有时间开销

        多核cpu(当核数>任务数),硬件并发

进程

        运行起来的一个可执行程序(一段程序的运行过程)

        资源分配的最小单位

线程

        一个进程有且只有一个主线程,主线程执行main函数

        主线程随着进程启动而执行

        用来执行代码的,代码的一条执行通路

        操作系统能调度的最小单位

C++11线程库

        以往windows使用CreateThread()、——beginthread创建线程;linux使用pthread_create()创建线程,多线程代码不能跨平台,也可以使用pthread库来创建多线程,但是需要在不同平台作不同配置。

        C++11语言增加了对多线程的支持,可以跨平台,不依靠操作系统

C++11创建线程(函数、类、lambda)

        #include <thread>

        thread(可调用对象);

        join():主线程阻塞,等待子线程print执行完毕

        detach():主线程不必等待子线程执行完毕,线程会驻留后台,由C++运行时库接管,并清理资源,此线程也称为守护线程。

        joinable():判断是否能够成功使用join或者detach,返回true,可以使用join或者detach

//函数作为线程的可调用对象
    //print可调用对象
    //1.创建了一个线程,线程起点是print。
    //2.线程print开始执行
    thread myObj(print);

    //主线程阻塞,等待子线程print执行完毕
    //myObj.join();

    //主线程不必等待子线程执行完毕
    //一旦使用detach(),就不能使用join()
    myObj.detach();

    //joinable():判断线程是否能够成功join或者detach()
    //返回true ,可以join或者detach
    bool flag = myObj.joinable();

//类作为线程的可调用对象
    class MyClass
    {
    public:
        MyClass() {}
        ~MyClass() {}

        void operator()() {
            cout << " operator  thread start" << endl;
            //``````````````
            cout << "operator  thread end" << endl;
        }
    };

    //线程调用
    MyClass obj2;//类的构造函数
    thread th(obj2);//类的默认拷贝构造函数
    th.join();
    bool fg = th.joinable();
    cout << "类 标志 = " << fg<<endl;

//lambda表达式作为线程的可调用对象
    auto lambdaFun = [] {
        cout << " thread  lambda s" << endl;
        //``````````````
        cout << " thread lambda e" << endl;
    };
    thread th22(lambdaFun);
    th22.join();

线程需要避免的问题

        建议不适用detach,只使用join,避免局部变量失效

        线程id,使用std::this_thread::get_id()     

        std::ref(),不调用拷贝构造函数,=直接传的对象的引用,线程中的值更改能影响原来的值    

        使用独占智能指针作为线程参数,需要使用std::move()函数,只能使用join

 使用成员函数作为线程参数传递

        2.detach()的坑

                传递基础类型,使用值传递

                传递类对象(指针),避免隐式转换,在创建线程的同时显示构造新的临时变量,在线程函数的申明上,使用引用来传递

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值