一、多线程间的同步
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()停止当前线程的执行,等待目标线程执行结束