zoukankan      html  css  js  c++  java
  • 多线程间的同步

    多线程间的同步

     

     

    串行解决方案示例代码:

    复制代码
    #include <QCoreApplication>
    #include <QThread>
    #include <QDebug>
    #include <QObject>
    
    /*
    sum(n)=> 1 + 2 + 3 + ..... + n
    sum(1000)= ?
                [1,1000] = [1,300] + [301,600] + [601, 1000]
    */
    
    class Calculator : public QObject
    {
    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;
            }
    
            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()" ;
        int sum = 0;
        Calculator c1(1,300);
        Calculator c2(301,600);
        Calculator c3(601,1000);
    
        c1.setObjectName("c1");
        c2.setObjectName("c2");
        c3.setObjectName("c3");
    
        c1.work();
        c2.work();
        c3.work();
    
        sum = c1.result() + c2.result() + c3.result();
    
        qDebug() << "sum = " << sum;
        qDebug() << "main end()";
        return a.exec();
    }
    复制代码

    从打印结果看,c1先运行,c2再运行,最后c3再运行。这种串行解决方案完全可以解决求和问题,但是太低效了。

    编程实验:求和新解法——并行方案的代码示例:

    复制代码
    #include <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;
        }
    
        int result()
        {
            return m_result;
        }
    
    
    };
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        qDebug() << "main begin()" ;
        int sum = 0;
        Calculator c1(1,300);
        Calculator c2(301,600);
        Calculator c3(601,1000);
    
        c1.setObjectName("c1");
        c2.setObjectName("c2");
        c3.setObjectName("c3");
    
        c1.start();
        c2.start();
        c3.start();
    
        sum = c1.result() + c2.result() + c3.result();
    
        qDebug() << "sum = " << sum;
        qDebug() << "main end()";
        return a.exec();
    }
    复制代码

    从打印结果看,主线程先于子线程结束,c1,c2,c3这三个进程确实可以并行执行,执行速度也比串行解决方案快,但是执行结果却是错误的。为什么?

    问题:线程间总是完全独立毫无依赖吗?

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

     

     编程实验,并行计算初探

    复制代码
    #include <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;
        }
    
        int result()
        {
            return m_result;
        }
    
    
    };
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        qDebug() << "main begin()" ;
        int sum = 0;
        Calculator c1(1,300);
        Calculator c2(301,600);
        Calculator c3(601,1000);
    
        c1.setObjectName("c1");
        c2.setObjectName("c2");
        c3.setObjectName("c3");
    
        c1.start();
        c2.start();
        c3.start();
    
        /*在这个地方主线程需要等待3个子线程执行结束,才能再执行*/
        c1.wait();
        c2.wait();
        c3.wait();
    
        sum = c1.result() + c2.result() + c3.result();
    
        qDebug() << "sum = " << sum;
        qDebug() << "main end()";
        return a.exec();
    }
    复制代码

     效率提高了,运行结果也完全正确。

    看一下wait函数的介绍,在linux编程中,这个函数类似于pthread_join()

  • 相关阅读:
    基于屏幕的可用区域
    Legacy Browser/Windows/Office Support
    getBoundingClientRect 和 getClientRect
    基础健康知识——12.自限性疾病
    基础健康知识——11.弊病
    基础健康知识系列
    基础健康知识——常见疾病:腹泻
    基础健康知识——常见疾病:感冒
    基础健康知识——10.就医
    基础健康知识——9.反复感染
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14320626.html
Copyright © 2011-2022 走看看