QT之使用QMutex/ QMutexLocker互斥量同步线程小例子
来源:互联网 发布:strutting it 编辑:程序博客网 时间:2024/05/21 18:33
接上一篇,在多线程中基本上都需要解决线程同步问题,本篇文章主要将介绍如何使用QMutex/ QMutexLocker互斥量来同步线程。
首先,先回顾下Qt官网QThreads general usage介绍,其中有一段基本上介绍了其使用方法,如下:
The main thing in this example to keep in mind when using a QThread is that it's not a thread. It's a wrapper around a thread object. This wrapper provides the signals, slots and methods to easily use the thread object within a Qt project. To use it, prepare a QObject subclass with all your desired functionality in it. Then create a new QThread instance, push the QObject onto it using moveToThread(QThread*) of the QObject instance and call start() on the QThread instance. That's all. You set up the proper signal/slot connections to make it quit properly and such, and that's all.
现在,直接上售票的小例子:
Step1. 按Qt介绍的用法:先创建一个继承QObject的类,把要执行的函数包装进里面:
.h 文件代码如下:
#ifndef TICKETSELLER_H#define TICKETSELLER_H#include <QObject>#include <QThread>#include <QMutex>#include <string>class TicketSeller : public QObject{public: TicketSeller(); ~TicketSeller();public slots: void sale();public: int* tickets; QMutex* mutex; std::string name;};#endif // TICKETSELLER_H
.cpp 文件代码如下:
#include "ticketseller.h"#include <iostream>TicketSeller::TicketSeller(){ tickets = 0; mutex = NULL;}TicketSeller::~TicketSeller(){}void TicketSeller::sale(){ while((*tickets) > 0) { mutex->lock(); std::cout << name << " : " << (*tickets)-- << std::endl; mutex->unlock(); } /*while((*tickets) > 0) { QMutexLocker locker(mutex); std::cout << name << " : " << (*tickets)-- << std::endl; locker.unlock(); }*/}
Step2. 按Qt介绍的用法:创建一个实例,使用moveToThread将对象移至QThread内,并连接信号槽,最后调用start()方法:
main.cpp 文件代码如下:
#include <QCoreApplication>#include <QMutex>#include <QThread>#include <string>#include "ticketseller.h"int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); int ticket = 100; QMutex mutex; /*创建设置线程1*/ //创建线程1 QThread t1; TicketSeller seller1; //设置线程1 seller1.tickets = &ticket; seller1.mutex = &mutex; seller1.name = "seller1"; //将对象移动到线程 seller1.moveToThread(&t1); /*创建设置线程2*/ //创建线程2 QThread t2; TicketSeller seller2; seller2.tickets = &ticket; seller2.mutex = &mutex; seller2.name = "seller2"; //将对象移动到线程 seller2.moveToThread(&t2); QObject::connect(&t1, &QThread::started, &seller1, &TicketSeller::sale); QObject::connect(&t2, &QThread::started, &seller2, &TicketSeller::sale); t1.start(); t2.start(); return a.exec();}
QT 中使用 QMutex/ QMutexLocker 比Window API CreateMutex 配合 WaitForSingleObject 同步线程要简单得多。
- QT之使用QMutex/ QMutexLocker互斥量同步线程小例子
- QT之使用QReadWriteLocker互斥量同步线程小例子
- QT之使用QSemaphore信号量同步线程小例子
- QT之使用 QWaitCondition 同步线程小例子
- Qt 线程同步(QMutex、QWaitCondition、QSemaphore)
- 使用QMutex进行线程同步的探讨
- QMutex 與 QMutexLocker
- Qt之多线程-QMutex
- Qt之QMutex
- Qt4 Gossip: QMutex 與 QMutexLocker
- QMutex QMutexLocker简单实例应用
- 多线程之同步线程通信小例子
- qt QMutex(互斥量)
- 使用Event同步线程的小例子
- QT 之 QMutexLocker如何安全锁住全局变量
- 线程同步的小例子
- Qt之线程同步
- Qt之线程同步
- 贪心算法
- Codeforces-682A:Alyona and Numbers(水题)
- 调用百度地图API确定地址的经纬度,根据地址的经纬度查找中文地址
- TableLayout与ViewPager联动
- 【算法导论33】跳跃表(Skip list)原理与java实现
- QT之使用QMutex/ QMutexLocker互斥量同步线程小例子
- Asp.net MVC3 自定义HtmlHelper控件
- The SetStack Computer UVA
- 继承
- CentOS7 安装Chrome浏览器
- Java命名约定
- 学习u3d中的专业名词
- React Native顶-底部导航使用小技巧
- Web Service核心知识