zoukankan      html  css  js  c++  java
  • Qt的读写锁QReadWriteLock要怎么玩?

      QReadWriteLock从名字看就知道是读写锁的意思。和QMutex一样,QReadWriteLock也是线程同步的一种工具。那么它有什么用呢?和QMutex又有什么区别呢?写个例子瞧一瞧。

         在写例子前,先看看要用到的函数:lockForRead、lockForWrite和unlock。比QMutex的例子多一个,从名字上可以看得出来是把lock分为了readlock和writelock。unlock和QMutex里的是一样的,有lock就要unlock。

        例子:

        1.从QThread派生一个类ReadThread,重写run函数。

        blob.png

        其中gRwLock是一个QReadWriteLock类型的全局对象,run函数的作用就是简单的打印三句话。

        2.创建两个ReadThread的对象并start。

    blob.png

        看看运行结果:

        blob.png

        两个线程还是交替运行的。这是什么情况?我的锁怎么没用呢?........没用就对了,QReadWriteLock是允许并行读的,当调用写锁时其他的lock就要等待。是时候让lockForWrite出场了。

        3.再从QThread派生一个类WriteThread,重写run函数。

    blob.png

    WriteThread的run函数里调用的是lockForWrite,锁住的也是三个qDebug。在刚才的基础上再创建一个WriteThread的对象看看运行效果。

    blob.png

    blob.png

    运行结果可能会有差异,但是write的三句话始终会按顺序执行。这时候锁才发挥了它的作用。

    总结:读写锁允许并行的读,如果遇到写锁时其它锁被锁住。写锁的优先级要高于读锁,如等待的锁中有读锁和写锁时,一旦上一个锁被解锁时会优先执行写锁。QReadWriteLock相对于QMutex的好处是当要保护的对象在大多数的情况是读操作偶尔写操作时,不会造成不必要的堵塞。

     转自:https://www.fearlazy.com/index.php/post/99.html

  • 相关阅读:
    proc文件系统的简介
    linux获取文件属性(API)
    busybox inittab文件分析
    设计模式之Builder模式
    This用法
    以 280W 数据为依据。对比SQL2008 表分区前和分区后的 T_SQL 效率
    jquery数据验证插件(自制,简单,练手)
    C# 每天温习一点(IEnumerable<TSource>)
    多线程应用扫盲(如何简单使用多线程)
    之前做web性能优化的一些个人心得
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/13528776.html
Copyright © 2011-2022 走看看