Qt 线程间同步

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;
}

现在再来看看运行结果
在这里插入图片描述
嗯,这才是我们想要的。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值