首页 > 编程语言 > 详细

第74课 多线程间的同步

时间:2017-01-13 00:10:02      阅读:272      评论:0      收藏:0      [点我收藏+]

1. 多线程编程的本质

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

(2)在宏观上所有线程并行执行。但微观上线程仍是按一定的顺序串行地执行

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

2. 串行解决方案和并行解决方案

(1)问题提出

技术分享 

(2)两种解决方案

技术分享 

3. 线程的同步

(1)同步的概念:在特殊情况下,控制多线程间的相对执行顺序

(2)线程间可能存在时序上的依赖

技术分享 

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

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

QThread t;

t.start();  //启动子线程

t.wait();   //等待子线程执行结束。(注意,会阻塞当前线程,而不是子线程,应该理解成wait t)

【编程实验】求各计算的串行解决方案和并行解决方案

#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();
}

4. 小结

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

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

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

(4)wait()阻塞当前线程的执行,等待目标线程执行结束。

第74课 多线程间的同步

原文:http://www.cnblogs.com/5iedu/p/6280258.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!