• 第七十四课、多线程间的同步------------------狄泰软件学院


    一、多线程间的同步

    1、多线程编程的本质

    (1)、并发性是多线程编程的本质

    (2)、在宏观上,所有线程并行执行

    (3)、多个线程间相互独立,互不干涉

    2、特殊情况下,多线程存在依赖

    煮菜和煮饭这两个线程结束后,才能进行吃饭的线程

    3、同步的概念

    (1)、在特殊情况下,控制多线程间的相对执行顺序

    (2)、QThread类支持线程间的同步

    #include <QCoreApplication>
    #include <QThread>
    #include <QDebug>
    
    /*
     * sum(n) = 1 + 2 + 3 + ... + n
     * sum(1000) ==>分解成3个任务
     *          [1, 1000] = [1, 300] [301, 600] [601, 1000]
     */
    
    class Calculator : public QThread
    {
    protected:
        int m_begin;
        int m_end;
        int m_result;
    
        void run()
        {
            qDebug() << objectName() << " : run() begin";
    
            for(int i=m_begin; i<=m_end; i++)
            {
                m_result += i;
                msleep(10);
            }
    
             qDebug() << objectName() << " : run() end";
        }
    
    public:
        Calculator(int begin, int end)
        {
            m_begin = begin;
            m_end = end;
            m_result = 0;
        }
    
        //模拟串行解决方案
        void work()
        {
             run();
        }
    
        int getResult()
        {
            return m_result;
        }
    };
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        qDebug() << "main begin";
    
        Calculator cal1(1, 300);    //任务1
        Calculator cal2(301, 600);  //任务2
        Calculator cal3(601, 1000); //任务3
    
        cal1.setObjectName("cal1");
        cal2.setObjectName("cal2");
        cal3.setObjectName("cal3");
    
        //模拟串行解决方案(将run函数作为一般的成员函数调用)
        //cal1.work();  //先完成任务1
        //cal2.work();  //再完成任务2
        //cal3.work();  //最后完成任务3
        //int result = cal1.getResult() + cal2.getResult() + cal3.getResult();
        //qDebug() << "result = " << result;
    
        //并行解决方案(利用多线程解决)
        cal1.start(); //启动线程1
        cal2.start(); //启动线程2
        cal3.start();  //启动线程3
    
        cal1.wait();  //等待线程1结束
        cal2.wait();  //等待线程2结束
        cal3.wait();  //等待线程3结束
    
        int result = cal1.getResult() + cal2.getResult() + cal3.getResult();//必须等三个子线程结束后再进行结果的相加,否则将出现错误
        qDebug() << "result = " << result;
    
        qDebug() << "main end";
    
        return a.exec();
    }
    wait()函数的使用

    二、小结

    (1)、在默认情况下,各个线程独立存在,并行执行

    (2)、在特殊情况下,多线程的执行在时序上存在依赖

    (3)、QThread类直接支持线程间的同步,(wait()成员函数)

    (4)、wait()停止当前线程的执行,等待目标线程执行结束  

  • 相关阅读:
    主席树模板之区间问题
    简易版第k大(权值线段树+动态开点模板)
    Irrigation
    Petya and Array
    H. Pavel's Party(权值线段树)
    权值线段树入门
    位数差(二分)
    ZYB's Premutation(树状数组+二分)
    单调队列入门
    javaBean为什么要implements Serializable?
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6443094.html
Copyright © 2020-2023  润新知