• 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

  • 相关阅读:
    iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)
    object_getClassName swift得到类名
    UIGestureRecognizerDelegate设置响应事件优先级
    String to Double in swift
    Unable to boot device in current state:Booted
    xcode Indexing | Loading index...
    swift String to UTF8编码
    进入沙盒目录
    swift objective-c混编操作
    storyboard plain style unsupported in a navigation item
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/13528776.html
Copyright © 2020-2023  润新知