版权声明:课程笔记内容整理于狄泰软件 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()停止当前线程的执行,等待目标线程执行结束