qt 线程同步-读写锁(QReadWriteLock)

        使用互斥量时存在一个问题:每次只能有一个线程获得互斥量的权限。如果在一个程序中有多个线程读取某个变量,使用互斥量时也必须排队。而实际上若只是读取一个变量,是可以让多 个线程同时访问的,这样互斥量就会降低程序的性能。

        例如,假设有一个数据采集程序,一个线程负责采集数据到缓冲区,一个线程负责读取缓冲区的数据并显示,另一个线程负责读取缓冲区的数据并保存到文件。实际上,数据生成后,显示和保存同时访问buff时并不会冲突。

        Qt提供了QReadWriteLock类,它是基于读或写的模式进行代码段锁定。QReadWriteLock以读或写锁定的同步方法允许以读或写的方式保护一段代码,它可以允许多个线程以只读方式同步访问资源,但是只要有一个线程在以写方式访问资源时,其他线程就必须等待直到写操作结束。

QReadWriteLock提供以下几个主要的函数:

        •lockForRead(),以只读方式锁定资源,如果有其他线程以写入方式锁定,这个函数会阻塞;

        •lockForWrite(),以写入方式锁定资源,如果本线程或其他线程以读或写模式锁定资源,这 个函数就阻塞;

        •unlock(),解锁;

        •tryLockForRead(),是 lockForRead()的非阻塞版本;

        •tryLockForWrite(),是 lockForWrite()的非阻塞版本。

使用QReadWriteLock,上面的三线程代码可以写为如下的形式:

int buffer [100];
QReadWriteLock Lock;

void threadDAQ::run()
{
    ...
    Lock.lockForWrite();
    get_data_and_write_in_buffer();	 // 数据写入 buffer
    Lock.unlock();
    ...
}

void threadShow::run()
{
    ...
    Lock.lockForRead();
    show_buffer(); // 读取buffer里的数据并显示 Lock.unlock();
    Lock.unlock();
    ...
}

void threadSaveFile::run()
{
    ...
    Lock.lockForRead();
    Save_buffer_toFile();	//读取buffer里的数据并保存到文件
    Lock.unlock();
}

        这样,如果 threadDAQ没有以lockForWrite()锁定 Lock,threadShow和threadSaveFile可以同时访问buffer,否则 threadShow和 threadSaveFile都被阻塞;如果threadShow和threadSaveFile都没有锁定,那么threadDAQ能以写入方式锁定,否则threadDAQ就被阻塞。

        QReadLocker、QWriteLocker是QReadWriteLock的简便形式,如同QMutexLocker是QMutex的简便版本一样,无需与unlock。配对使用。使用QReadLocker和QWriteLocker,则上面的代码改写为:

int buffer [100];
QReadWriteLock Lock;

void threadDAQ::run()
{
    ...
    QWriteLocker Locker(&Lock);
    get_data_and_write_in_buffer();	 // 数据写入 buffer
    ...
}

void threadShow::run()
{
    ...
    QWriteLocker Locker(&Lock);
    show_buffer(); // 读取buffer里的数据并显示 Lock.unlock();
    ...
}

void threadSaveFile::run()
{
    ...
    QWriteLocker Locker(&Lock);
    Save_buffer_toFile();	//读取buffer里的数据并保存到文件
}

 传送门qt多线程系列文章目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jingbo1801

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值