千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  应聘面试  >  物联网面试题  > Qt多线程同步的几种实现方式

Qt多线程同步的几种实现方式

来源:千锋教育
发布人:syq
时间: 2022-09-01 14:03:44 1662012224

  1. 互斥量:QMutex QMutex类提供的是线程之间的访问顺序化。QMutex的目的是保护一个对象/数据结构或者代码段在同一时间只有一个线程可以访问。基本使用方法如下: QMutex mutex; int var; void function() { mutex.lock(); // 访问var var * var; mutex.unlock(); } 如果使用mutex加锁,却没有使用unlock解锁,那么就会造成死锁,其他线程永远也得不到访问变量的机会,所以为了解决这个问题,Qt引入了QMutexLocker类,二者直接可以配合使用更加方便简洁,示例如下: QMutex mutex; int var; void function() { QMutextLocker locker(&mutex); // 访问var var * var; }

Qt多线程同步

  2. QReadWriteLock QMutex只允许某个时刻有一个线程对共享资源进行访问,如果需要多个线程对共享资源进行读访问,同时只有一个线程进行写访问,这种情况下就可以使用QReadWriteLock。QReadWriteLock主要实现多个线程读资源,一个线程写。写线程执行的时候会阻塞所有的读线程,而读线程之间的运行不需要进行同步。使用示例如下: int var; QReadWriteLock lock; void function() { lock.lockForRead(); int x = var; lock.unlock(); } void function2() { lock.lockForWrite(); var = 100; lock.unlock(); } 和QMutexLocker一样,Qt同样提供了QReadLocker和QWriteLocker。 int var; QReadWriteLock lock; void fun() { QReadLocker(&lock); int x = var; } void fun2() { QWriteLocker(&lock); var = 1000; }

  3. QSemaphore QSemaphore是QMutex的一般化,它可以保护一定数量的相同资源,而QMutex只能保护一个资源。信号量比互斥量具有更好的并发性,我们可以利用信号量实现生产者-消费者模式,如下所示: const int dataSize = 100000; const int bufferSize = 1024; char buffer[bufferSize]; QSemaphore freeBytes(bufferSize); QSemaphore usedButes; void Producer::run() { for (int i = 0; i < dataSize; ++i) { freeBytes.acquire(); buffer[i % bufferSize] = i; usedBytes.release(); } } void Consumer::run() { for (int i = 0; i < dataSize; ++i) { usedBytes.acquire(); qDebug() << buffer[i % bufferSize]; freeBytes.release(); } }

  更多关于物联网培训的问题,欢迎咨询千锋教育在线名师。千锋教育拥有多年IT培训服务经验,采用全程面授高品质、高体验培养模式,拥有国内一体化教学管理及学员服务,助力更多学员实现高薪梦想。

tags:
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT