1.示例:消费者和生产者问题
消费者消费一个产品,生产者生产一个产品
#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include <QString>
static QString g_store;
class Producer : public QThread
{
protected:
void run()
{
int count = 0;
while(true)
{
g_store.append(QString::number((count++) % 10));
qDebug() << objectName() << ":" + g_store;
msleep(1);
}
}
};
class Customer : public QThread
{
protected:
void run()
{
while(true)
{
if( g_store != "")
{
g_store.remove(0, 1); //去除第一个元素
qDebug() << objectName() << ":" + g_store;
}
msleep(1);
}
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Producer p;
Customer c;
p.setObjectName("Producer");
c.setObjectName("Customer");
p.start();
c.start();
return QCoreApplication::exec();
}
但是当消费者和生产者同时访问g_store时,就会产生竞争,程序会崩溃
2.临界资源:每次只允许一个线程进行访问(读/写)的资源
线程间的互斥(竞争):多个线程在同一时刻都需要访问临界资源
QMutex类是一把线程锁,保证线程间的互斥,利用线程锁能够保证临界资源的安全性
3.QMutex中的关键成员函数
-
void lock() 当锁空闲时,获取锁并继续执行;当锁被获取,阻塞并等待锁释放
-
void unlock() 释放锁(同一把锁的获取和释放锁必须在同一线程中成对出现)
#include
#include
#include
#include
#includestatic QString g_store;
static QMutex g_mutex;class Producer : public QThread
{
protected:
void run()
{
int count = 0;
while(true)
{
g_mutex.lock();
g_store.append(QString::number((count++) % 10));qDebug() << objectName() << ":" + g_store; g_mutex.unlock(); msleep(1); } }};
class Customer : public QThread
{
protected:
void run()
{
while(true)
{
g_mutex.lock();
if( g_store != "")
{
g_store.remove(0, 1); //去除第一个元素
qDebug() << objectName() << ":" + g_store;
}
g_mutex.unlock();
msleep(1);
}}};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);Producer p; Customer c; p.setObjectName("Producer"); c.setObjectName("Customer"); p.start(); c.start(); return QCoreApplication::exec();}