第74课 - 多线程间的同步

版权声明:课程笔记内容整理于狄泰软件 https://blog.csdn.net/qq_39654127/article/details/81945648

1、多线程间的同步 

多线程编程的本质是什么?

     -并发性是多线程编程的本质 

     -在宏观上,所有线程并行执行 

     -多个线程间相对独立,互不干涉 

 

常规解决方案设计: 

               

 

线程间总是完全独立毫无依赖的吗? 

       -  在特殊情况下,多线程的执行在时序上存在依赖! 

 

生活中的例子

同步的概念 

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

QThread类直接支持线程间的同步 

      -bool QThread::wait(unsigned long time = ULONG_MAX) 

    QThread t;
    
    t.start(); //创建并启动子线程
    t.wait(); //等待子线程执行结束

 

2、编程实验 

求和的新解法、并行计算初探   74-1.pro 

#include <QtCore/QCoreApplication>
#include <QThread>
#include <QDebug>

/*
  sum(n) => 1 + 2 + 3 + ... + n

  sum(1000) => ?

            [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 result()
    {
        return m_result;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "main begin";

    Calculator cal1(1, 300);
    Calculator cal2(301, 600);
    Calculator cal3(601, 1000);

    cal1.setObjectName("cal1");
    cal2.setObjectName("cal2");
    cal3.setObjectName("cal3");

    // cal1.work();
    // cal2.work();
    // cal3.work();

    cal1.start();
    cal2.start();
    cal3.start();

    cal1.wait();
    cal2.wait();
    cal3.wait();

    int result = cal1.result() + cal2.result() + cal3.result();

    qDebug() << "result = " << result;

    qDebug() << "main end";
    
    return a.exec();
}

若没有wait操作,得到的结果是0(三个子线程还没结束就直接获取结果值)

 

3、小结 

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

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

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

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

 

猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/81945648