第74课、多线程间的同步

    科技2026-03-01  7

    一、多线程间的同步

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

    1 + 2 + 3 + … + 1000 通过串行和并行两种方案来进行分别计算

    串行:

    main.cpp

    #include <QCoreApplication> #include <QThread> #include <QDebug> class Calculate : 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: Calculate(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()"; Calculate cal1(1, 300); Calculate cal2(301, 600); Calculate cal3(601, 1000); cal1.setObjectName("cal1"); cal2.setObjectName("cal2"); cal3.setObjectName("cal3"); cal1.work(); cal2.work(); cal3.work(); int result = cal1.result() + cal2.result() + cal3.result(); qDebug() << result; qDebug() << "main end()"; return a.exec(); }

    并行解决方案:

    #include <QCoreApplication> #include <QThread> #include <QDebug> class Calculate : 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: Calculate(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()"; Calculate cal1(1, 300); Calculate cal2(301, 600); Calculate cal3(601, 1000); cal1.setObjectName("cal1"); cal2.setObjectName("cal2"); cal3.setObjectName("cal3"); // cal1.work(); // cal2.work(); // cal3.work(); cal1.start(); cal2.start(); cal3.start(); int result = cal1.result() + cal2.result() + cal3.result(); //0的原因是因为子线程还没运行完,主线程的这条语句就运行了 qDebug() << result; qDebug() << "main end()"; return a.exec(); }

    result = 0 的原因是因为子线程还没运行完,主线程的这条语句就运行了

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

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

    特殊情况下,多线程存在依赖 煮菜和煮饭这两个线程结束后,才能进行吃饭的线程

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

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

    main.cpp

    #include <QCoreApplication> #include <QThread> #include <QDebug> class Calculate : 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: Calculate(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()"; Calculate cal1(1, 300); Calculate cal2(301, 600); Calculate 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; qDebug() << "main end()"; return a.exec(); }

    小结 1、 在默认情况下,各个线程独立存在,并行执行 2、 在特殊情况下,多线程的执行在时序上存在依赖 3、 QThread 类直接支持线程间的同步,(wait()成员函数,同步:协同步调,互相配合) 4、 wait()停止当前线程的执行,等待目标线程执行结束
    Processed: 0.009, SQL: 9