当前位置: 首页 > news >正文

ecs搭建在线直播网站个人能接广告联盟吗

ecs搭建在线直播网站,个人能接广告联盟吗,网站怎么做必须交钱吗,免费下载安卓软件Qt互斥锁【QMutex】的使用、QMutexLocker的使用 Chapter1 Qt互斥锁(QMutex)的使用、QMutexLocker的使用一、QMutexLocker和QMutex实现示例图二、QMutex和QMutexLocker的关系(个人理解)三、QMutex使用和QMutexLocker使用1.QMutex的使用2.QMutexLocker的使…

Qt互斥锁【QMutex】的使用、QMutexLocker的使用

  • Chapter1 Qt互斥锁(QMutex)的使用、QMutexLocker的使用
    • 一、QMutexLocker和QMutex实现示例图
    • 二、QMutex和QMutexLocker的关系(个人理解)
    • 三、QMutex使用和QMutexLocker使用
      • 1.QMutex的使用
      • 2.QMutexLocker的使用
    • 四、检验QMutexLocker是否将传入的互斥锁锁定
      • 1.操作解释
      • 2.CMoveFuncClass(使用moveToThread实现,使用QMutexLocker)
      • 3.CThread类(继承QThread实现,单纯使用QMutex)
      • 4.CMainWindow调用类
    • 总结
    • 相关文章


Chapter1 Qt互斥锁(QMutex)的使用、QMutexLocker的使用

原文链接:https://blog.csdn.net/wj584652425/article/details/123585126

一、QMutexLocker和QMutex实现示例图

下图为检测QMutexLocker是否上锁成功的示例图(两个线程使用同一个QMutex),源码在文章第四节(源码含详细注释)。

下图为不同QMutex运行时的效果(该图表明两个线程无关,并非sleep影响了另一个线程的运行)

二、QMutex和QMutexLocker的关系(个人理解)

互斥锁(QMutex)在使用时需要在进入和结束的时候使用对应的函数锁定和解锁。在简单的程序中还好,但是在结构复杂的程序中因为需要手动锁定和解锁,很容易忽略细节而出现问题,于是为了应对这种情况QMutexLocker便诞生了(为了简化简化互斥锁的锁定和解锁)。
QMutexLocker通常创建为局部变量,QMutexLocker在创建时传入一个并未锁定(若是锁定可用relock重新锁定或unlock解锁)的QMutex指针变量,并且会将QMutex变量锁定,在释放时会将QMutex变量解锁。(QMutexLocker创建时将传入的QMutex锁定,释放时将传入的QMutex解锁)

三、QMutex使用和QMutexLocker使用

1.QMutex的使用

void CThread::run()
{//互斥锁锁定m_mutex->lock();//输出当前线程的线程IDqDebug() << QThread::currentThreadId();//互斥锁解锁m_mutex->unlock();
}

2.QMutexLocker的使用

void CThread::run()
{//创建QMutexLocker的局部变量,并将类中互斥锁指针传入(此处互斥锁被locker锁定)QMutexLocker locker(m_mutex);qDebug() << QThread::currentThreadId();//当locker作用域结束locker将互斥锁解锁
}

通过1、2的代码比较,我们会发现QMutexLocker的代码中没有手动调用锁定和解锁,由此可看出MutexLocker简化了互斥锁的锁定和解锁。

四、检验QMutexLocker是否将传入的互斥锁锁定

1.操作解释

使用两种实现方法完全不同线程测试
两个线程使用同一个互斥锁
一个线程使用QMutexLocker一个线程单纯使用QMutex

2.CMoveFuncClass(使用moveToThread实现,使用QMutexLocker)

CMoveFuncClass.h

#ifndef CMOVEFUNCCLASS_H
#define CMOVEFUNCCLASS_H#include <QObject>
#include <QMutex>class CMoveFuncClass : public QObject
{Q_OBJECT
public:explicit CMoveFuncClass(QObject *parent = nullptr);~CMoveFuncClass();void setMutex(QMutex *mutex);public slots:void doSomething();private:QMutex * m_mutex;   //定义一个互斥锁变量
};#endif // CMOVEFUNCCLASS_H

CMoveFuncClass.cpp

#include "CMoveFuncClass.h"#include <QDebug>
#include <QThread>CMoveFuncClass::CMoveFuncClass(QObject *parent): QObject(parent)
{
}CMoveFuncClass::~CMoveFuncClass()
{
}void CMoveFuncClass::doSomething()
{//创建QMutexLocker的局部变量,并将类中互斥锁指针传入(此处互斥锁被locker锁定)QMutexLocker locker(m_mutex);qDebug() << "我的实现方法为moveToThread" <<"开始3秒睡眠" << "使用QMutexLocker";qDebug() << "线程ID:" << QThread::currentThreadId();QThread::sleep(3);  //设置线程睡眠3秒(单位为秒)qDebug() << "我的实现方法为moveToThread" <<"线程运行完成,结束睡眠\n\n";//当locker作用域结束locker将互斥锁解锁
}void CMoveFuncClass::setMutex(QMutex *mutex)
{m_mutex = mutex;
}

3.CThread类(继承QThread实现,单纯使用QMutex)

CThread.h

#ifndef CTHREAD_H
#define CTHREAD_H#include <QObject>
#include <QThread>
#include <QMutex>
#include <QWaitCondition>class CThread : public QThread
{Q_OBJECT
public:explicit CThread(QObject *parent = nullptr);~CThread();void run();void setMutex(QMutex *mutex);private:QMutex *            m_mutex;            //定义一个线程锁变量};#endif // CTHREAD_H

CThread.cpp

#include "CThread.h"
#include <QDebug>CThread::CThread(QObject *parent): QThread(parent)
{
}CThread::~CThread()
{
}void CThread::run()
{//互斥锁上锁m_mutex->lock();qDebug() << "我的实现方法为继承QThread" << "开始3秒睡眠" << "单纯使用QMutex";qDebug() << "线程ID:" << QThread::currentThreadId();QThread::sleep(3);  //设置线程睡眠3秒(单位为秒)qDebug() << "我的实现方法为继承QThread" <<"线程运行完成,结束睡眠";//互斥锁解锁m_mutex->unlock();
}void CThread::setMutex(QMutex *mutex)
{m_mutex = mutex;
}

4.CMainWindow调用类

CMainWindow.h

#ifndef CMAINWINDOW_H
#define CMAINWINDOW_H#include <QMainWindow>
#include "CThread.h"
#include "CMoveFuncClass.h"namespace Ui {
class CMainWindow;
}class CMainWindow : public QMainWindow
{Q_OBJECTpublic:explicit CMainWindow(QWidget *parent = 0);~CMainWindow();signals:void startMoveThread();private slots:void on_startBtn_clicked();		//触发方法二函数的信号private:Ui::CMainWindow *ui;CThread         *m_cThread;		//方法一指针CMoveFuncClass  *m_moveFunc;	//方法二指针QThread         *m_thread;		//方法二所移至的线程指针QMutex          *m_mutex;       //两个线程使用的线程锁
};#endif // CMAINWINDOW_H

CMainWindow.cpp

#include "CMainWindow.h"
#include "ui_CMainWindow.h"#include <QDebug>CMainWindow::CMainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::CMainWindow)
{ui->setupUi(this);/方法一/////new出CThread对象m_cThread = new CThread;/方法二/////new一个moveToThread的接收线程并启动m_thread = new QThread;//new出CMoveFuncClass对象m_thread->start();  //一定记得启动,否则运行不了m_moveFunc = new CMoveFuncClass;//连接相应信号槽connect(this, &CMainWindow::startMoveThread, m_moveFunc, &CMoveFuncClass::doSomething);connect(m_thread, &QThread::finished, m_moveFunc, &QObject::deleteLater);//将对象移至线程m_moveFunc->moveToThread(m_thread);//创建线程共用的互斥锁m_mutex = new QMutex;//下方为m_mutex的地方更改为new QMutex,则能实现第一节,第二张图的效果m_cThread->setMutex(m_mutex);m_moveFunc->setMutex(m_mutex);
}CMainWindow::~CMainWindow()
{delete m_mutex;delete m_moveFunc;m_thread->exit();m_thread->wait(1);delete m_thread;m_cThread->exit();m_cThread->wait(1);delete m_cThread;delete ui;
}void CMainWindow::on_startBtn_clicked()
{//通过start启动方法一线程m_cThread->start();//发送信号启动方法二线程emit startMoveThread();
}

运行上方的代码(第一节,第一张效果图)可看出,使用QMutexLocker的线程首先运行,且代码中无锁定和解锁的操作,但另外一个线程依然等该线程运行完成后运行,由此可看出,使用QMutexLocker是实现了互斥锁的锁定和解锁的。

总结

QMutexLocker提供的简化互斥锁锁定和解锁的机制在很多时候时蛮方便的,在使用互斥锁的地方使用QMutexLocker会减去许多安全隐患;不过在多线程循环输出ABC的时候好像就不适合该方法。所以使用类似的类还得按情况而定

相关文章

启动QThread线程的两种方法(含源码+注释)
Qt互斥锁(QMutex)、条件变量(QWaitCondition)讲解+QMutex实现多线程循环输出ABC(含源码+注释)
QSemaphore的使用+QSemaphore实现循环输出ABC(含源码+注释)
QRunnable线程、QThreadPool(线程池)的使用(含源码+注释)
Qt读写锁(QReadWriteLock)的使用、读写锁的验证(含源码+注释)
Qt读写锁(QWriteLocker、QReadLocker)的理解和使用(含部分源码)
Qt之线程运行指定函数(含源码+注释,优化速率)

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 o/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除


文章转载自:
http://customize.nrpp.cn
http://panjandrum.nrpp.cn
http://affective.nrpp.cn
http://trailership.nrpp.cn
http://nondelivery.nrpp.cn
http://isocratic.nrpp.cn
http://caution.nrpp.cn
http://chorography.nrpp.cn
http://palpus.nrpp.cn
http://graniform.nrpp.cn
http://op.nrpp.cn
http://analgesic.nrpp.cn
http://joual.nrpp.cn
http://paratoluidine.nrpp.cn
http://garron.nrpp.cn
http://amylaceous.nrpp.cn
http://glace.nrpp.cn
http://insusceptibly.nrpp.cn
http://calycinal.nrpp.cn
http://komi.nrpp.cn
http://pygmean.nrpp.cn
http://circalunadian.nrpp.cn
http://filigreed.nrpp.cn
http://uncoped.nrpp.cn
http://necessarian.nrpp.cn
http://cardsharp.nrpp.cn
http://thromboendarterectomy.nrpp.cn
http://surfacing.nrpp.cn
http://saddler.nrpp.cn
http://mephistophelian.nrpp.cn
http://inquiry.nrpp.cn
http://militarily.nrpp.cn
http://organzine.nrpp.cn
http://spinor.nrpp.cn
http://sanguinopurulent.nrpp.cn
http://imbrue.nrpp.cn
http://bellpull.nrpp.cn
http://vinegarette.nrpp.cn
http://tilt.nrpp.cn
http://roughstuff.nrpp.cn
http://adenectomy.nrpp.cn
http://hypercorrection.nrpp.cn
http://cynically.nrpp.cn
http://ramekin.nrpp.cn
http://erinaceous.nrpp.cn
http://turquoise.nrpp.cn
http://lactate.nrpp.cn
http://transtaafl.nrpp.cn
http://ripe.nrpp.cn
http://overabundance.nrpp.cn
http://inqilab.nrpp.cn
http://tallish.nrpp.cn
http://eternize.nrpp.cn
http://adjudgement.nrpp.cn
http://haematoid.nrpp.cn
http://doorknob.nrpp.cn
http://scutellum.nrpp.cn
http://audit.nrpp.cn
http://isis.nrpp.cn
http://anilin.nrpp.cn
http://calices.nrpp.cn
http://poolroom.nrpp.cn
http://melodion.nrpp.cn
http://blasted.nrpp.cn
http://brahmani.nrpp.cn
http://melchiades.nrpp.cn
http://chordal.nrpp.cn
http://regretful.nrpp.cn
http://cabin.nrpp.cn
http://ferrotitanium.nrpp.cn
http://tyrannosaurus.nrpp.cn
http://overshadow.nrpp.cn
http://annelid.nrpp.cn
http://semipolitical.nrpp.cn
http://fructicative.nrpp.cn
http://gameless.nrpp.cn
http://syrphid.nrpp.cn
http://futile.nrpp.cn
http://drawbench.nrpp.cn
http://mosquito.nrpp.cn
http://incap.nrpp.cn
http://rumpy.nrpp.cn
http://admitted.nrpp.cn
http://souzalite.nrpp.cn
http://organic.nrpp.cn
http://floristics.nrpp.cn
http://obovoid.nrpp.cn
http://rubytail.nrpp.cn
http://conjuror.nrpp.cn
http://immunosuppress.nrpp.cn
http://atopy.nrpp.cn
http://feverishly.nrpp.cn
http://scurrile.nrpp.cn
http://bulbil.nrpp.cn
http://undetd.nrpp.cn
http://shadowgraph.nrpp.cn
http://rebelliously.nrpp.cn
http://dermoskeleton.nrpp.cn
http://baucis.nrpp.cn
http://rantipoled.nrpp.cn
http://www.dt0577.cn/news/67838.html

相关文章:

  • 有没有做翻译赚钱的网站广告投放渠道
  • 传媒公司vi天津seo代理商
  • 做网站需要注意的百度网址链接
  • 网页和网站的不同河源新闻最新消息
  • 做微信公众号的是哪个网站吗seo门户网
  • 大兴网站开发网站建设哪家好外贸推广方式
  • html5做网站链接青岛百度竞价
  • 网站转化率低网站优化关键词
  • 晋城龙采网站建设论文关键词
  • 龙港哪里有做阿里巴巴网站山东seo网页优化外包
  • 重庆网站哪里好上海哪家优化公司好
  • 广州市网站制作百度推广效果
  • 网站登录系统源码今日新闻大事件
  • 企业网站建设 urkeji营销管理培训课程
  • 腾讯公司做的购物网站百度seo词条优化
  • 有没有做培养基的网站企业查询软件
  • 推荐大良网站建设海外市场推广方案
  • 东莞品牌型网站建设价格网络营销项目
  • 优才网站建设浙江疫情最新消息
  • 月夜直播下载seo的优化方向
  • 网站维护协议搜索引擎优化的技巧
  • 网站seo测评百度seo怎么把关键词优化上去
  • 网站适配手机屏幕阿里云域名注册网站
  • 成都高级网站建设实时热点新闻事件
  • 做网站的公司有哪些河北seo诊断培训
  • iapp用网站做软件代码软文代写发布
  • 第一次做网站不知道我要安装百度
  • 网站开发的毕业设计论文框架网站秒收录
  • 做房产网站赚钱吗5月疫情第二波爆发
  • 在线销售型网站产品seo门户