農林漁牧網

您現在的位置是:首頁 > 畜牧業

Qt的讀寫鎖QReadWriteLock要怎麼玩?

2022-05-14由 程式設計師fearlazy 發表于 畜牧業

qtngz 怎麼寫

QReadWriteLock從名字看就知道是讀寫鎖的意思。和QMutex一樣,QReadWriteLock也是執行緒同步的一種工具。那麼它有什麼用呢?和QMutex又有什麼區別呢?寫個例子瞧一瞧。

在寫例子前,先看看要用到的函式:lockForRead、lockForWrite和unlock。比QMutex的例子多一個,從名字上可以看得出來是把lock分為了readlock和writelock。unlock和QMutex裡的是一樣的,有lock就要unlock。

例子:

1。從QThread派生一個類ReadThread,重寫run函式。

Qt的讀寫鎖QReadWriteLock要怎麼玩?

其中gRwLock是一個QReadWriteLock型別的全域性物件,run函式的作用就是簡單的列印三句話。

2。建立兩個ReadThread的物件並start。

Qt的讀寫鎖QReadWriteLock要怎麼玩?

看看執行結果:

Qt的讀寫鎖QReadWriteLock要怎麼玩?

兩個執行緒還是交替執行的。這是什麼情況?我的鎖怎麼沒用呢?……。。沒用就對了,QReadWriteLock是允許並行讀的,當呼叫寫鎖時其他的lock就要等待。是時候讓lockForWrite出場了。

3。再從QThread派生一個類WriteThread,重寫run函式。

Qt的讀寫鎖QReadWriteLock要怎麼玩?

WriteThread的run函數里呼叫的是lockForWrite,鎖住的也是三個qDebug。在剛才的基礎上再建立一個WriteThread的物件看看執行效果。

Qt的讀寫鎖QReadWriteLock要怎麼玩?

Qt的讀寫鎖QReadWriteLock要怎麼玩?

執行結果可能會有差異,但是write的三句話始終會按順序執行。這時候鎖才發揮了它的作用。

總結:讀寫鎖允許並行的讀,如果遇到寫鎖時其它鎖被鎖住。寫鎖的優先順序要高於讀鎖,如等待的鎖中有讀鎖和寫鎖時,一旦上一個鎖被解鎖時會優先執行寫鎖。QReadWriteLock相對於QMutex的好處是當要保護的物件在大多數的情況是讀操作偶爾寫操作時,不會造成不必要的堵塞。

我是fearlazy!文章內容僅代表個人觀點如有雷同純屬正常。由於文章不適合貼程式碼,若有原始碼需求請移步本人獨立部落格。

Qt的讀寫鎖QReadWriteLock要怎麼玩?