Qt中的讀寫鎖

2021-07-30 03:59:24 字數 1541 閱讀 3323

qt中的qreadwritelock類為我們提供了讀寫鎖的功能。讀寫鎖是用來保護可以被讀訪問和寫訪問的資源的一種同步工具。如果你想讓多個執行緒同時的對資源進行讀訪問,但只要有乙個執行緒要對資源進行寫訪問時,所有其他的執行緒必須等待,直到寫訪問完成。對於這種情況,讀寫鎖是非常有用的。

讀寫鎖的使用也非常簡單,如下例子**所示:

qreadwritelock lock;

void readerthread::run()

void writerthread::run()

同時,為了確保寫操作不會被讀操作永遠阻塞,當有等待中的寫操作時,請求讀操作會被阻塞,即使當前的鎖由另乙個讀操作持有。同樣,當鎖被乙個寫操作持有時,另乙個寫操作進來了,那麼寫操作將會優先於讀操作獲得鎖。

和qmutex一樣,qreadwritelock也可以被同乙個執行緒遞迴的鎖定,只要在建構函式中傳入乙個qreadwritelock::recursive標誌。在這種情況下,unlock()被呼叫的次數必須和lockforwrite()或lockforread()被呼叫的次數一樣多。但要注意,在乙個執行緒中,遞迴鎖定的型別不能改變,即不能先以讀操作上鎖,又要以寫操作上鎖。

同樣,為了方便使用qreadwritelock,qt還提供了qreadlocker和qwritelocker兩個方便類。能使我們更方便的使用讀寫鎖的功能。即我們可以使用下面這種方式來使用讀寫鎖的功能:

qreadwritelock lock;

qbytearray readdata()

void writedata(const qbytearray &data)

下面我們寫乙個例子,來使用以下qreadwritelock。

新建乙個qt控制台程式。在main.cpp中,定義共享資料和讀寫鎖。**如下:

#include "writethread.h"

int scores = ;

qreadwritelock rwlock;

int main(int argc, char *argv)

此處,我們啟動了10個讀執行緒,乙個寫執行緒,來模擬多個讀者,乙個寫者的情況。

下面,新建出這兩個執行緒,使用qthread類。

其中,讀執行緒的run()函式實現如下:

extern int scores[10];

extern qreadwritelock rwlock;

void readthread::run()

}

讀操作,是不斷的從陣列中隨機的讀取資料。

寫執行緒的run()函式實現如下:

extern int scores[10];

extern qreadwritelock rwlock;

void writethread::run()

}

寫操作,在陣列中隨機的寫入乙個隨機數。然後睡眠1秒。

QT中XML的讀寫

最近工作的專案中涉及到了xml檔案的處理,這裡做以及關於qt處理xml檔案的記錄。xml是一種很好的儲存資料的檔案。可以儲存資料量較大的並且帶有不同屬性的內容,其中xml採用的是倒樹形結構。由乙個根節點往後蔓延多個孩子節點,每個孩子節點下面又有多個孩子節點。每乙個節點中又可設定attribute。q...

Qt中遞迴鎖的使用

1.在基類中定義整個程序中唯一的一把遞迴鎖 xx.h 定義巨集,去呼叫遞迴鎖 define cuteview mutex locker mutex ptr qmutexlocker locker mutex ptr class cmutex public qobject typedef single...

linux系統中讀寫鎖的問題

問題描述 我們的應用程式採用了共享記憶體和讀寫鎖的機制來實現多程序的併發訪問,但測試時發現讀寫鎖有問題,我們所採用的鎖是pthread rwlock rdlock pthread rwlock wrlock這組函式。現象 pthread rwlockattr setpshared attr,pthr...