QT\C++多线程互斥同步等待

10 篇文章 0 订阅
4 篇文章 0 订阅

使用QT进行相关编程的小伙伴对多线程应该挺熟悉的,如果想使用QT进行内部数据处理,那么一定得创建子线程,且将程序内部流程放置在子线程中进行处理,否则QT界面将进入假死——未响应状态。

今天我们来交流一下QT多线程的同步问题。

如果你的程序需要进行多线程处理,比如多线程读、写磁盘数据,按正常的情况来写,我们会使用CreateMutex()函数创建互斥量进行逻辑设计,通过WaitForSingleObject()获取互斥量,通过ReleaseMutex()释放互斥量,这种写法是没有问题的(至少我认为没问题),但是有时候可能会产生莫名其妙的错误,而且可以定位到是线程同步出现问题,这时候我建议你使用另一种方法——


原子性同步操作(本身自带锁,同一时间只能由一个线程进行操作,保证了共享数据的安全性、正确性!)

在QT中,原子性同步方法为:

#include <QAtomicInt> 
QAtomicInt Finish;            //全局变量
    
Finish.ref();                 //对Finish做原子加1操作,一般放在子线程函数中
Finish.deref();               //对Finish做原子减1操作,一般放在子线程函数中

这个Finish的相关操作是原子级别的,可以保证当前只有一个线程在执行此操作;
对当前Finish值做判断和赋值即可充当互斥量Mutex的作用

在VS(C++)中,原子性同步方法为:

LONG mutex = 0;                //全局变量

InterlockedDecrement(&mutex);  //对变量mutex做原子性-1操作,一般放在子线程中
InterLockedIncrement(&mutex);  //对变量mutex做原子性+1操作,一般放在子线程中

InterLocked的相关操作是原子级别的,可以保证当前只有一个线程在执行此操作;
对当前mutex值做判断和赋值即可充当互斥量Mutex的作用

原子级别的操作可以很好保证线程执行的唯一性,是多线程保持同步操作的另一个好方法!

对原子级别同步、多线程同步不清楚的可以参考下面的链接:

InterlockedIncrement函数详解_zhongguoren666的博客-CSDN博客_interlockedincrement

最后,有帮助的话可以给我一丢丢赞赏嚯!(记得备注CSDN,我会更有动力更新文章嚯!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值