Qt 中直接支持跨平台的多线程处理方案 QThread。既然涉及到了多线程,那么肯定就会遇到线程的同步问题。
什么是同步?让我们看一个例子。
老师让我用计算器计算从 0 累加到 1000 的值。于是我开始从零开始累加。。。。
可是我觉得太累了,为什么我不把这个问题拆成几个小任务来做呢,求 0 到 200 的和,求 201 到 400 的和,求 401 到 600 的和 ,求 601 到 800 的和 ,求 801 到 1000 的和。最后将所有和加起来。
于是我找了4个小伙伴,每人发一个计算器,一起帮我算数数。。。。
很显然,现实中这样做能提高我们的效率。在 Qt 中我们来模拟现实中的情况吧。上代码
class CalculateThread : public QThread
{
public:
CalculateThread(int start=0,int end=0)
{
m_sum = 0;
m_start = start>end?end:start;
m_end = start<end?end:start;
m_toStop = false;
}
void run()
{
msleep(500);
doCalculate();
}
void stop()
{
m_toStop = true;
}
int getSum()
{
return m_sum;
}
private:
bool doCalculate()
{
int sum = 0;
for(int i = m_start ; !m_toStop&&(i<=m_end) ; i++){
sum = sum + i;
}
m_sum = sum;
return true;
}
protected:
volatile bool m_toStop;
int m_sum;
int m_start;
int m_end;
};
int main(int argc, char *argv[])
{
CalculateThread cal1(1,200);
CalculateThread cal2(201,400);
CalculateThread cal3(401,600);
CalculateThread cal4(601,800);
CalculateThread cal5(801,1000);
cal1.start();
cal2.start();
cal3.start();
cal4.start();
cal5.start();
int sum = cal1.getSum() + cal2.getSum() + cal3.getSum() + cal4.getSum() + cal5.getSum() ;
qDebug()<<sum<<endl;
return 0;
}
计算结果是什么呢?
居然是 0 。
仔细看看问题出在了哪里。
从结果可以分析出,当我们在获取线程计算结果的时候,线程还没计算完毕,我们就去获取了。这么一来得到的结果就是错误的。我们应该等线程都计算完后才去获取他们计算的结果。
稍微修改一下 main 代码
int main(int argc, char *argv[])
{
CalculateThread cal1(1,200);
CalculateThread cal2(201,400);
CalculateThread cal3(401,600);
CalculateThread cal4(601,800);
CalculateThread cal5(801,1000);
cal1.start();
cal2.start();
cal3.start();
cal4.start();
cal5.start();
//这里我们等待线程运行结束
cal1.wait();
cal2.wait();
cal3.wait();
cal4.wait();
cal5.wait();
int sum = cal1.getSum() + cal2.getSum() + cal3.getSum() + cal4.getSum() + cal5.getSum() ;
qDebug()<<sum<<endl;
return 0;
}
现在再来看看运行结果
嗯,这才是我们想要的。