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

  • 相关阅读:
    C++ 值传递、指针传递、引用传递
    typedef与#define的区别
    const与#define的区别
    头文件重复引用
    多态
    ng双向数据绑定
    angular响应式编程
    angular的一些问题
    npm install 权限的问题
    typescript的入门
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/13528776.html
Copyright © 2011-2022 走看看