一、概述
1、讀寫鎖是一種線程同步機制,用于解決多線程環境下的讀寫競爭問題。
2、讀寫鎖允許多個線程同時獲取讀鎖(共享訪問),但只允許一個線程獲取寫鎖(獨占訪問)。
3、這種機制可以提高并發性能,因為多個線程可以同時讀取共享資源而不會相互干擾。
4、當一個線程有寫鎖時,其它線程的讀鎖和寫鎖請求會被阻塞,直到寫鎖被釋放。
5、QReadWriteLock是Qt框架提供用于線程同步的類,它是一個讀寫鎖(Read-Write Lock)。讀寫鎖允許多個線程同時進行讀操作,但在寫操作時需要獨占訪問。
二、使用方法
1、使用寫鎖
QReadWriteLock lock;//方式一:
lock.lockForWrite();
//這里修改共享資源
lock.unlock();//方式二:
QWriteLocker locker(&lock);
//這里修改共享資源
?2、使用讀鎖
QReadWriteLock lock;//方式一:
lock.lockForRead();
//這里讀取共享資源
lock.unlock();//方式二:
QReadLocker locker(&lock);
//這里讀取共享資源
三、?QReadWriteLock::RecursionMode
1、Recursive:遞歸模式,一個線程可以多次鎖定同一個讀寫鎖,并且在進行相應數量的unlock()調用之前讀寫鎖不會被解鎖。
QReadWriteLock m_lock{ QReadWriteLock::Recursive };
2、NonRecursive:非遞歸模式,默認值。一個線程只能鎖定一個讀寫鎖一次。
QReadWriteLock m_lock{ QReadWriteLock::NonRecursive };
四、常用成員函數?
1、void lockForRead()
獲取讀鎖,如果沒有其它線程持有寫鎖,則能夠立即獲取讀鎖。如果有其它線程持有寫鎖,則當前線程會被阻塞,直到寫鎖被釋放。
2、void lockForWrite()
獲取寫鎖,如果沒有其它線程持有讀鎖或寫鎖,則能狗立即獲取寫鎖。如果有其它線程持有寫鎖或讀鎖,則當前線程會被阻塞,直到所有讀鎖和寫鎖都被釋放。
3、void unlock()
?釋放讀鎖或寫鎖。如果當前線程持有讀鎖,則釋放讀鎖。如果持有寫鎖,則釋放寫鎖。嘗試解除未鎖定的鎖是會導致程序終止。
4、bool tryLockForRead()
嘗試獲取讀鎖,如果獲得了則返回true。如果另一個線程已經鎖定寫鎖,則獲取嘗試將失敗,?但它不會阻塞(與lockForRead()的不同)。
5、bool tryLockForRead(int timeout)
重載函數,如果另一個線程已經獲取寫鎖,則會等待timeout毫秒看是否已經被釋放了。?
6、bool tryLockForWrite()
嘗試獲取寫鎖,如果獲得了則返回true,否則立即返回false。如果另一個線程獲取了寫或讀鎖,則嘗試獲取失敗。
7、bool tryLockForWrite()
重載函數,如果另一個線程已經獲取寫或讀鎖,則等待timeout毫秒看釋放已經釋放了。?
五、示例?
// 共享數據變量
QString sharedData;
// 讀寫鎖
QReadWriteLock lock;// 讀取操作線程
class ReaderThread : public QThread
{
public:void run() override{QReadLocker locker(&lock);qDebug() << "Read Data: " << sharedData;}
};// 寫入操作線程
class WriterThread : public QThread
{
public:void run() override{QWriteLocker locker(&lock);sharedData = "this is my city!";qDebug() << "Write Data: " << sharedData;}
};int main(int argc, char *argv[])
{QApplication a(argc, argv);ReaderThread thread1;WriterThread thread2;thread1.start();thread2.start();thread1.wait();thread2.wait();return a.exec();
}
運行結果: