你将收获

本课程,讲解的重点定位在c++11新标准中的多线程开发部分,同时,老师还会结合自己的经验把多线程的讲解进一步拓展到一个比较大的范畴,因为无论是c++11多线程开发还是各种其他的多线程开发实现方法,都有很多类似的地方或者说是相通的理论、技巧和要遵循的规则;同学们再学完以后,将对多线程程序开发有一个全面任何和深刻理解,从此再也不用担心自己写不好多线程程序了。

适用人群

(1)对c++语言本身有一定的掌握,处于中级或以上水平(2)对c++11新标准里的内容和语法也要有一定的掌握

课程介绍

本课程,讲解的重点定位在c++11新标准中的多线程开发部分,同时,老师还会结合自己的经验把多线程的讲解进一步拓展到一个比较大的范畴,因为无论是c++11多线程开发还是各种其他的多线程开发实现方法,都有很多类似的地方或者说是相通的理论、技巧和要遵循的规则;

课程讨论

讲到detach时,屏幕开始不断闪烁

为什么不断闪烁

老师,有没有QQ群啊,课件如何获得啊

讲的很好,很仔细,我受益匪浅,非常感谢!

不错,收获到的不仅仅是知识,更多的是一种分析问题的方法。通过举恰当的例子剖析问题得到本质。老师授人鱼且授人渔,点赞

老师讲的很详细。正确及错误的调用例子都讲到了,并把错误的原因也分析的很清楚。虽然老师有点地方口音,但讲的尽职尽责,我确实有收获。总体感觉比某博客上的视频讲好很多,给老师点个赞

老师的其他课程在哪里呢 没有搜到呢 可否提供下链接?

很好的课程 看完了很想学习老师其他的课程

很好的课程,很认真的学完,非常收益,谢谢

老师讲得很不错!能否出一套关于线程池的项目实战视频?急需向高手学习项目实战提升技能!!!

同学笔记

  • a32629 2020-03-05 10:48:03

    来源:async、future、packaged_task、promise 查看详情

    1. std::async、std::futrue创建后台任务并返回值

    希望线程返回一个结果

    std::async是一个函数模版,用来启动一个异步任务,启动一个异步任务后,他返回一个std::future对象,std::futrue是一个类模版。

    什么叫“启动一个异步任务”,就是自动创建一个线程并开始执行线程入口函数,它返回一个std::futrue对象

    这个std::futrue对象里含有入口函数所返回的结果,我们可以通过调用futrue对象的成员函数get()来获取结果。

    这个结果没法马上拿到,在将来的某个时刻可以拿到。

    程序会卡在get,直到子线程执行结束并返回值,所以一定要有返回值。

    2. std::packaged_task

    打包任务,把任务包装起来

    是一个类模版,它的模版参数是各种可调用对象;通过std::packaged_task把各种可调用对象包装起来,方便将来作为线程入口函数 

    3. std::promise

    类模版,可以在某个线程中给它复制,然后我们可以在其他线程中,把这个值取出来。

    void mythread(std::promise<int> &tmpp, int calc)

    {

    calc++;

    calc*=10;

    std::chrono::milliseconds dura(5000);

     

    int result = calc;

    tmpp.set_value(result);

    return;

    }

    std::promise<int> myprom;

    std::thread tl(mythread, std::ref(prom),180);

     

    std::futrue<int> ful = myprom.get_future();

    cout<<ful.get<<endl;

    4. 小结

  • a32629 2020-03-05 09:35:05

    来源:condition_variable、wait、notify_one、notify_all 查看详情

    1. 条件变量std::condition_variable\wait()\notify_one()

    std::condition_variable my_cond;

    my_cond.wait(subguard1,[this]{

    if(!msgRecvQue.empty()){

    return true;

     

    }

    return false;

    })

    //wait()用来等一个东西

    //如果第二个参数lambda表达式返回值是true,那wait()直接返回;

    //如果第二个参数lambda表达式返回值是false,那wait()互斥量将解锁,并堵塞到本行。直到其他线程调用notify_once成员函数为止。

    //如果没有第二个lambda函数,就和返回false一样。

        //当其他线程使用notify_once

        //b.1 mycond尝试获得锁,获得之后执行后续代码

        //b.2如果没获得锁,就继续休眠

        //b.3如果没有第二个参数,则和返回true一样。

    注意:notify_one不是每次都能唤醒wait,只有在wait堵塞时才能成功唤醒。

    std::unique_lock<mutex> subguard1(mymutex);

     

     

    2.上述代码思考

    消息会不会执行的不及时

    消息在执行时notify_one无效,因为没有卡在wait();

    3.notify_all()

    notify_one只能通知一个线程。

    notify_all通知多个线程。

  • a32629 2020-03-04 23:21:03

    来源:单例设计模式共享数据分析、解决,call_once 查看详情

    1.设计模式

    老外 先有项目,后有设计模式

    中国 硬套设计模式

    2. 单例模式

    3. 单例模式在多线程中的使用

    双重锁定(双重检查)

    在GetInstance中两个if(m_instance==NULL);

    //

    if(m_instance==NULL){

        std::unique_lock<mutex> mymutex(resource_mutex);

    if(m_instance==NULL){

    m_instance=new MyCAS();

    static CFarhuishou cl; //类套类,为了delete m_instance.

    }

    }

     

    4. std::call_once() //c++11引入的函数,该函数第二个参数是一个函数名a();

    call_once功能是保证函数a()只执行一次。

    static std::once_flag g_flag;

     

    std::call_once(g_flag,CreateMyinstance);

     

    总结:最好在主线程中先创建instance,避免单例共享代码的问题。

没有更多了