首页 » PHP教程 » php线程互斥技巧_Qt开拓多线程间的互斥

php线程互斥技巧_Qt开拓多线程间的互斥

访客 2024-12-07 0

扫一扫用手机浏览

文章目录 [+]

(1)、有n个生产者同时制造产品,并把产品放入仓库中

(2)、有m个消费者同时从仓库中取出产品

php线程互斥技巧_Qt开拓多线程间的互斥

(3)、规则

php线程互斥技巧_Qt开拓多线程间的互斥
(图片来自网络侵删)

A、当仓库未满,任意生产者可以存入产品

B、当仓库未空,任意消费者可以取出产品

2、生活中的线程互斥例子

标示牌用于指示是否可用:

红绿灯标识十字路口是否可用:

3、线程互斥的干系观点

(1)、临界资源(Critical Resource):每次只许可一个线程访问(读/写)的资源

(2)、线程间的互斥(竞争):多个线程在同一个韶光都须要访问临界资源

(3)、QMutex类是一把线程锁,担保线程间的互斥:利用线程锁能够担保临界资源的安全性

4、QMutex中的关键成员函数(锁便是类似上面两个生活中例子的标识

(1)、void lock()

A、当锁空闲时,获取锁并连续实行

B、当锁别人被获取,堵塞并等待锁开释

(2)、void unlock()

A、开释锁(同一把锁的获取和开释必须在同一线程中成对涌现)

#include <QCoreApplication>#include <QThread>#include <QMutex>#include <QDebug>#define MAXSTORAGE 10 //最大仓库容量static QMutex g_mutex;static QString g_store;//生产者class Producer : public QThread{protected: void run() { int count = 0; while(true)//担保每个一毫秒生产产品 { g_mutex.lock();//若没有锁,程序运行一下可能崩溃,由于两个线程是并行的,生产者写的时候消费者来读, //就会产生冲突 if(g_store.count() <= MAXSTORAGE) { g_store.append(QString::number((count++) % 10));//产生的数字总是在0-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.count()>0) { g_store.remove(0, 1); qDebug() << objectName() << ":" + g_store; } g_mutex.unlock(); msleep(1); } }};int main(int argc, char argv[]){ QCoreApplication a(argc, argv); qDebug() << "main begin"; Producer p; Customer c; p.setObjectName("Produer"); c.setObjectName("Customer"); p.start(); c.start(); qDebug() << "main end"; return a.exec();}二、小结

(1)、临界资源每次只许可一个线程访问(读/写)

(2)、线程锁(QMutex)用于保护临界资源

(3)、线程只有获取锁之后才能访问临界资源

(4)、锁被其它线程获取时,当前哨程处于等待状态

(5)、线程锁的获取和开释必须在同一线程中成对涌现

【领QT开拓教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

「链接」

标签:

相关文章

php界说毛病级别技巧_php设置缺点级别

php缺点级别设置在php.ini中可以设置做事器对缺点的报警级别。在默认情形下,php将报告除了关照之外的所有缺点。缺点报告级别...

PHP教程 2024-12-09 阅读0 评论0

egretwingphp技巧_游戏开拓和软件开拓差异

游戏开拓实质上是一种软件开拓。游戏开拓和软件开拓都须要程序员利用代码逻辑来实现掌握。只是由于游戏开拓对素材(紧张是图片素材 和用户...

PHP教程 2024-12-09 阅读0 评论0