欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Qt 互斥锁 QMutex 的简单应用

发布时间:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Qt 互斥锁 QMutex 的简单应用 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

Qt 互斥锁 QMutex 的简单应用

在多线程解决问题中,经常会碰到多个线程操作同一片资源,有些时候用信号量的方式去处理,但有的时候需要用到互斥锁。

互斥锁:说白了就是,资源某个时间只能被一个线程使用。打个比方:家里的微波炉每次只能被一个人使用。

Qt中官网有个关于信号量的示例,http://doc.qt.io/qt-5/qtcore-threads-semaphores-example.html

我们将上面的示例改写,利用互斥锁来实现。

任务要求:

1、两条生产线,只能共用一个数据仓库,同时时间数据仓库只能被一条生产线来使用。
2、一条消费者先,只要数据仓库未空,就取出数据。

输入结果如下:

代码实现:

#include <QtCore> #include <stdio.h> #include <stdlib.h> #include <QDebug> #include <QList> #include<QMutex>const int DataSize = 15; const int BufferSize = 20;QList<char> bufferlist; //共享的数据列表QMutex mutexlock; //互斥锁// 生产者线程类 class Producer_01 : public QThread { public:void run(); };void Producer_01::run() {qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));for (int i = 0; i < DataSize; ++i) {mutexlock.lock();char test = "ACGT"[(int)qrand() % 4];bufferlist.append(test);qDebug() << QString("producer_01: %1").arg(test);mutexlock.unlock();sleep(1); } }class Producer_02 : public QThread { public:void run(); };void Producer_02::run() {qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));for (int i = 0; i < DataSize; ++i) {mutexlock.lock();char test = "HIJK"[(int)i % 4];bufferlist.append(test);qDebug() << QString("producer_02: %1").arg(test);mutexlock.unlock();msleep(300);} }// 消费者线程类 class Consumer : public QThread { public:void run(); };void Consumer::run() {while (1){if(bufferlist.isEmpty()==false) //如果数据列表未空,就从头还是取数据{msleep(500); //增加延时,表示消费的滞后时间qDebug() << QString("consumer: %1").arg(bufferlist[0]);bufferlist.removeAt(0); //删除链表的头}} }// 主函数 int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);Producer_01 producer_01; //创建生产者的线程Producer_02 producer_02;Consumer consumer; //创建消费者的线程producer_01.start(); //线程开启producer_02.start();consumer.start(); producer_01.wait(); producer_02.wait();consumer.wait();return app.exec(); }

总结:
1、互斥锁相对信号量更好理解和应用。
2、互斥锁同一时间只能被一条线程使用。本实例中最好在消费者线上也加上互斥锁,因为消费者线上也厚对共享列表的操作。

总结

以上是生活随笔为你收集整理的Qt 互斥锁 QMutex 的简单应用的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。