1、平时在写多线程的时候有时候会遇到下面一种情况:

情景:
this是主线程,model是子线程,把model move到线程后可以在主线程通过emit开启子线程,emit CalcuSignal();开启子线程执行StartCalculateAll,里面有是个循环。emit CancelSignal(true);开启子线程执行CancelSlot(bool),把bool值给到isFinish。
在StartCalculateAll里面循环的时候会判断isFinish值,如果是true就退出循环。
现在这样操作:
先emit CalcuSignal();//子线程执行十遍循环,每遍循环结束都会判断下isFinish
然后通过点击按钮触发emit CancelSignal(true); //我预想结果是一旦执行这条,就会在子线程CancelSlot方法中给isFinish赋true,然后循环会在当前这遍结束判断isFinish为true退出。
结果是:
先emit CalcuSignal();//开启子线程执行循环
循环还没结束emit CancelSignal(true); //无法开启子线程发送信号,直到循环全部结束才开启子线程把信号传递过来。
原因:
因为StartCalculateAll和CancelSlot都是在同一子线程中执行的,StartCalculateAll还没执行完的时候无法执行同一线程其他方法
这样修改:
先emit CalcuSignal();//开启子线程执行循环
循环还没结束在主线程model.CancelSlot(true); //这属于主线程给isFinish赋值,这样两者不在一个线程,循环会在当前结束判断isFinish为ture退

文章探讨了多线程编程中的问题,如如何在主线程和子线程间正确通信、线程锁的使用(包括静态全局锁与读写锁)、以及如何避免线程对象在构造和析构期间的并发问题。作者给出了两种多线程使用方式并强调了线程安全的重要性。
最低0.47元/天 解锁文章
2116

被折叠的 条评论
为什么被折叠?



