网站模板html整站,网站seo关键字优化,2020十大网络热词,品牌网站要这么做一、概述
1、读写锁是一种线程同步机制#xff0c;用于解决多线程环境下的读写竞争问题。
2、读写锁允许多个线程同时获取读锁#xff08;共享访问#xff09;#xff0c;但只允许一个线程获取写锁#xff08;独占访问#xff09;。
3、这种机制可以提高并发性能…一、概述
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();
}
运行结果