线程间同步(QT)

本文详细介绍了QT中实现线程同步的几种方法,包括QMutex互斥锁、QWaitCondition条件变量、信号量Semaphore、读写锁以及如何防止死锁。通过使用这些机制,可以确保在多线程环境中正确地访问共享数据,提高程序的稳定性和效率。
摘要由CSDN通过智能技术生成

目录

1. 互斥锁

2. 条件变量

3. 信号量

4. 读写锁

5. 死锁


        多个线程同时访问共享数据时可能会冲突,出现意料之外的结果,这源于操作的原子性问题,关于操作原子性可问度娘,这里不多做解释。

保证线程间同步的方法有:

c++ Qt
互斥锁 QMute
条件变量 QWaitCondition
信号量 QSemaphore
读写锁 QReadLocker、QWriteLocker、QReadWriteLock

1. 互斥锁QMutex

        使用场景:多个线程同时访问共享数据时可能发生冲突

        基本功能:上锁、解锁(且同一时间只能有一个线程上锁)

        使用mutex.lock()和mutex.unlock()来锁住两个以上的资源块,这样CPU在进行线程调度,切换到这些资源块时会判断互斥锁mutex是否能上锁,若能,则上锁,并执行该资源块,否则进入阻塞状态,将执行权交由其它线程,等下次调度到该线程再次判断是否能上锁,按此规律直到获取到锁,或进入死锁状态。

        另外还有trylock(int time=0)函数,该函数用于尝试获取锁,并可以设置未获取到锁的等待时间,与lock()不同的是,trylock()函数不会使线程一直阻塞,而lock()函数的超时间是无穷大,即未获取到锁会一直阻塞(我认为这是死锁的最重要因素,关于死锁,后面会介绍)

        其它操作类:QMutexLocker,提供便捷的加解锁操作,在其创建时加锁,析构时自动解锁,详细如下。

  int complexFunction(int flag)
  {
      QMutexLocker locker(&mutex);  //加锁只需要由mutex创建一个QMutexLocker对象

      int retVal = 0;
      switch (flag) {
      case 0:
      case 1:
          return moreComplexFunction(flag);   //1
      case 2:
          {
              int status = anotherFunction();
              if (status &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值