第74课 多线程间的同步

一、多线程间的同步

    1、 多线程编程的本质

        1.1、 并发性是多线程编程的本质
        1.2、 宏观上,所有线程并行执行
        1.3、 多个线程间相互独立,互不干涉
                


            

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

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

    3、 同步的概念

        3.1、 在特殊情况下,控制多线程间的相对执行顺序
        3.2、 QThread类支持线程间的同步
                

wait()函数的使用:



#include <QtCore/QCoreApplication>
#include <QThread>
#include <QDebug>
/*
    sum(n) = 1 + 2 + 3 + 4 +...... + 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()//重写run方法
    {
        qDebug() << objectName() << ": run()  begin";
        for(int i=m_begin; i<=m_end; i++)
        {
            m_result += i;
            msleep(10);     //延时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();
    cal2.start();
    cal3.start();   //三个线程并行执行
    cal1.wait();
    cal2.wait();
    cal3.wait();    //等待三个线程执行完毕,再执行下面的语句。线程的同步(协同步调的意思)
    //必须等三个子线程结束后再进行结果的相加,否则将出现错误。
    int result = cal1.getResult() + cal2.getResult() + cal3.getResult();
    qDebug() << "result = " << result;
    qDebug() << "main() end";
    return a.exec();
}



二、小结

    1、 在默认情况下,各个线程独立存在,并行执行
    2、 在特殊情况下,多线程的执行在时序上存在依赖
    3、 QThread类直接支持线程间的同步,(wait()成员函数,同步:协同步调,互相配合)
    4、 wait()停止当前线程的执行,等待目标线程执行结束  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值