QReadWriteLock從名字看就知道是讀寫鎖的意思。和QMutex一樣,QReadWriteLock也是線程同步的一種工具。那么它有什么用呢?和QMutex又有什么區別呢?寫個例子瞧一瞧。
在寫例子前,先看看要用到的函數:lockForRead、lockForWrite和unlock。比QMutex的例子多一個,從名字上可以看得出來是把lock分為了readlock和writelock。unlock和QMutex里的是一樣的,有lock就要unlock。
例子:
1.從QThread派生一個類ReadThread,重寫run函數。
其中gRwLock是一個QReadWriteLock類型的全局對象,run函數的作用就是簡單的打印三句話。
2.創建兩個ReadThread的對象並start。
看看運行結果:
兩個線程還是交替運行的。這是什么情況?我的鎖怎么沒用呢?........沒用就對了,QReadWriteLock是允許並行讀的,當調用寫鎖時其他的lock就要等待。是時候讓lockForWrite出場了。
3.再從QThread派生一個類WriteThread,重寫run函數。
WriteThread的run函數里調用的是lockForWrite,鎖住的也是三個qDebug。在剛才的基礎上再創建一個WriteThread的對象看看運行效果。
運行結果可能會有差異,但是write的三句話始終會按順序執行。這時候鎖才發揮了它的作用。
總結:讀寫鎖允許並行的讀,如果遇到寫鎖時其它鎖被鎖住。寫鎖的優先級要高於讀鎖,如等待的鎖中有讀鎖和寫鎖時,一旦上一個鎖被解鎖時會優先執行寫鎖。QReadWriteLock相對於QMutex的好處是當要保護的對象在大多數的情況是讀操作偶爾寫操作時,不會造成不必要的堵塞。
轉自:https://www.fearlazy.com/index.php/post/99.html