当前位置: 首页> 游戏> 单机 > 51ppt模板免费下载完整版免费ppt_西安是哪个省市_百度站长工具收费吗_2021小说排行榜百度风云榜

51ppt模板免费下载完整版免费ppt_西安是哪个省市_百度站长工具收费吗_2021小说排行榜百度风云榜

时间:2025/8/12 19:36:20来源:https://blog.csdn.net/maokexu123/article/details/142660271 浏览次数:0次
51ppt模板免费下载完整版免费ppt_西安是哪个省市_百度站长工具收费吗_2021小说排行榜百度风云榜

目的

互斥量的概念

互斥量是一个可以处于两态之一的变量:解锁和加锁。这样,只需要一个二进制位表示它,不过实际上,常常使用一个整型量,0表示解锁,而其他所有的值则表示加锁。互斥量使用两个过程。当一个线程(或进程)需要访问临界区时,它调用mutex_lock。如果该互斥量当前是解锁的(即临界区可用),此调用成功,调用线程可以自由进入该临界区。
另一方面,如果该互斥量已经加锁,调用线程被阻塞,直到在临界区中的线程完成并调用mutex_unlock。如果多个线程被阻塞在该互斥量上,将随机选择一个线程并允许它获得锁。

QMutex的用法

QMutex各QMutexLocker是基于互斥量的线程同步类,QMutex定义的实例是一个互斥量,QMutex主要提供了3个函数。
lock:
锁定互斥量,如果另外一个线程锁定了这个互斥量,它将阻塞执行直到其它线程解锁这个互斥量。
unlock:
解锁一个互斥量,需要与lock()配对使用。
tryLock():
试图锁定一个互斥量,如果成功锁定就返回true,如果其它线程已经锁定了这一个互斥量,就返回false,但不阻塞程序执行。
QMutexLocker:
是另外一个简化的互斥量处理的类。QMutexLocker的构造函数接受一个互斥量作为参数,将其锁定,QMutexLocker的析构函数则将此互斥量解锁。

例子

下面通过实现,两个程序对数量进行累加,演示互斥量的用法:

业务类:

#include "business.h"
#include <QDebug>
#include <QThread>
#include <QDateTime>
int Business::s_num = 0;
QMutex Business::s_mutex;
Business::Business(QObject *parent) : QObject(parent)
{
}
int Business::getNum()
{return s_num;
}
void Business::addNum()
{//qDebug()<<"enter function addNum currentThreadId=" << QThread::currentThreadId()//       <<" currentTime="<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");s_mutex.lock();s_num++;qDebug()<<"s_num="<<s_num;s_mutex.unlock();//qDebug()<<"exit function addNum currentThreadId=" << QThread::currentThreadId()//       <<" currentTime="<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
}
int Business::slot_getNum()
{return this->getNum();
}
void Business::slot_addNum()
{this->addNum();
}

线程类

#include "businessInThread.h"
BusinessInThread::BusinessInThread(QObject *parent) : QObject(parent)
{m_pWorkerThread = new QThread();m_pBusiness = new Business();m_pBusiness->moveToThread(m_pWorkerThread);connect(m_pWorkerThread, &QThread::finished, m_pBusiness, &QObject::deleteLater);connect(this, &BusinessInThread::signal_getNum, m_pBusiness,&Business::slot_getNum, Qt::BlockingQueuedConnection);connect(this, &BusinessInThread::signal_addNum, m_pBusiness, &Business::slot_addNum);m_pWorkerThread->start();
}
BusinessInThread::~BusinessInThread()
{m_pWorkerThread->quit();m_pWorkerThread->wait();
}
int BusinessInThread::getNum()
{return signal_getNum();
}
void BusinessInThread::addNum()
{signal_addNum();
}

主程序

#include <QCoreApplication>
#include "businessInThread.h"
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);BusinessInThread businessInThread1;BusinessInThread businessInThread2;for(int i = 0; i < 5; i++){businessInThread1.addNum();businessInThread2.addNum();}return a.exec();
}

运行结果:

在这里插入图片描述

如果去掉锁的话,就会这样:
在这里插入图片描述

QMutextLocker的简化用法

这个函数:

void Business::addNum()
{//qDebug()<<"enter function addNum currentThreadId=" << QThread::currentThreadId()//       <<" currentTime="<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");s_mutex.lock();s_num++;qDebug()<<"s_num="<<s_num;s_mutex.unlock();//qDebug()<<"exit function addNum currentThreadId=" << QThread::currentThreadId()//       <<" currentTime="<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
}

可以简化为:

void Business::addNum()
{//qDebug()<<"enter function addNum currentThreadId=" << QThread::currentThreadId()//       <<" currentTime="<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");//s_mutex.lock();QMutexLocker Locker(&s_mutex);s_num++;qDebug()<<"s_num="<<s_num;//s_mutex.unlock();//qDebug()<<"exit function addNum currentThreadId=" << QThread::currentThreadId()//       <<" currentTime="<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
}

总结

在这里插入图片描述

互斥锁,就是只有锁定与解锁,两种状态,可以说,是最简单的锁,也是最实用的锁。

关键字:51ppt模板免费下载完整版免费ppt_西安是哪个省市_百度站长工具收费吗_2021小说排行榜百度风云榜

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: