一、QReadWriteLock和QWriteLocker、QReadLocker(个人理解)
使用读写锁时,配合使用QWriteLocker和QReadLocker相对于单纯使用QReadWriteLock会更方便(如同QMutex和QMutexLocker的关系,友友们可以通过文末相应链接查看该内容)。 如单纯使用QReadWriteLock函数,线程在进入和退出的位置需要调用上锁和解锁函数,在代码结构复杂,内容繁琐的情况使用容易出现死锁问题;而QReadLocker和QWriteLocker就简化了读写锁的上锁、解锁操作,只需要在线程需要上锁的位置定义一个局部变量的QReadLocker或QWriteLocker并传入读写锁指针,该局部变量就会自动上锁,在其作用域结束时会将读写锁解锁
友情提示:若是没看过Qt读写锁(QReadWriteLock)的使用、读写锁的验证(含源码+注释),建议先看查看该内容
二、QWriteLocker、QReadLocker的使用
例子是将Qt读写锁(QReadWriteLock)的使用、读写锁的验证(含源码+注释)线程类中的run更改(直接将下方的run函数替换成该线程类中的run即可),代码如下:
void CThread::run()
{
int i = 0;
while(i++ != 4)
{
if(0 == m_flag)
{
QWriteLocker writeLocker(m_sLock);
writeFunc();
}
else if(1 == m_flag)
{
QReadLocker readLocker(m_sLock);
readFunc1();
}
else
{
QReadLocker readLocker(m_sLock);
readFunc2();
}
}
qDebug() << "标识符为:" << (int)m_flag << "的线程循环结束";
}
总结
使用须知:
- QWriteLocker、QReadLocker创建为局部变量
- 需要传入读写锁指针
- 创建时传入对应的读写锁指针会将读写锁,在作用域结束会自动解锁
QWriteLocker、QReadLocker的适用范围很广,在代码结构复杂,内容繁琐的情况使用,上锁和解锁操作也能得心应手,所以在适合的情况下建议优先使用这两个类。
相关文章
启动QThread线程的两种方法(含源码+注释) Qt互斥锁(QMutex)、条件变量(QWaitCondition)讲解+QMutex实现多线程循环输出ABC(含源码+注释) Qt互斥锁(QMutex)的使用、QMutexLocker的使用(含源码+注释) QSemaphore的使用+QSemaphore实现循环输出ABC(含源码+注释) QRunnable线程、QThreadPool(线程池)的使用(含源码+注释) Qt读写锁(QReadWriteLock)的使用、读写锁的验证(含源码+注释)
友情提示——哪里看不懂可私哦,让我们一起互相进步吧 (创作不易,请留下一个免费的赞叭 谢谢 ^o^/)
注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。 注:如有侵权,请联系作者删除
|