Qt 多线程同步之互斥锁
生产者-消费者模型
1.QMutex
QMutex需要配对使用lock()和unlock()来实现代码段的保护
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QQueue>
#include <QMutex>
#include <QDebug>
static int data = 100;
static QQueue<int> que;
static QMutex mutex;
class Producer : public QThread
{
Q_OBJECT
public:
explicit Producer(QThread *parent)
:QThread(parent)
{
}
protected:
void run()
{
for(int i=0;i<data;i++) //生产者生产的快
{
mutex.lock();
que.enqueue(i);
qDebug()<<"Producer produce: "<<QString::number(i);
mutex.unlock();
msleep(100);
}
}
};
class Customer : public QThread
{
Q_OBJECT
public:
explicit Customer(QThread *parent,int id)
:QThread(parent)
,m_id(id)
{
}
protected:
void run()
{
while(true)
{
mutex.lock();
if(!que.isEmpty())
{
int num = que.dequeue();
qDebug()<<"Customer"<<QString::number(m_id)<<" consume:"<<QString::number(num);
}
mutex.unlock();
msleep(300);//生产者消费的慢
}
}
private:
int m_id = 0;
};
#endif // MYTHREAD_H
建立3个消费者和一个生产者
#include <QCoreApplication>
#include "MyThread.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Producer producer(nullptr);
Customer customer1(nullptr,1);
Customer customer2(nullptr,2);
Customer customer3(nullptr,3);
producer.start();
customer1.start();
customer2.start();
customer3.start();
return a.exec();
}
2.使用QMutexLocker
QMutexLocker是另外一个简化了互斥量处理的类。QMutexLocker构造函数接受一个互斥量作为参数并将其锁定,QMutexLocker的析构函数则将此互斥量解锁,所以在QMutexLocker实例变量的生存期内的代码段得到保护,自动进行互斥量的锁定和解锁。
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QQueue>
#include <QMutex>
#include <QMutexLocker>
#include <QDebug>
static int data = 100;
static QQueue<int> que;
static QMutex mutex;
class Producer : public QThread
{
Q_OBJECT
public:
explicit Producer(QThread *parent)
:QThread(parent)
{
}
protected:
void run()
{
for(int i=0;i<data;i++) //生产者生产的快
{
{
QMutexLocker locker(&mutex);
que.enqueue(i);
qDebug()<<"Producer produce: "<<QString::number(i);
}
msleep(100);
}
}
};
class Customer : public QThread
{
Q_OBJECT
public:
explicit Customer(QThread *parent,int id)
:QThread(parent)
,m_id(id)
{
}
protected:
void run()
{
while(true)
{
{
QMutexLocker locker(&mutex);
if(!que.isEmpty())
{
int num = que.dequeue();
qDebug()<<"Customer"<<QString::number(m_id)<<" consume:"<<QString::number(num);
}
}
msleep(300);//生产者消费的慢
}
}
private:
int m_id = 0;
};
#endif // MYTHREAD_H
还没有评论,来说两句吧...