Qt线程同步之一个生产者多个消费者
来源:互联网 发布:在线数据库建模 编辑:程序博客网 时间:2024/06/01 23:07
QMutex
QMutex类提供的是线程之间的访问顺序化。
QMutex的目的是保护一段代码,使得同一时间只有一个线程可以访问它。但在一个线程中调用lock(),其它线程将会在同一地点试图调用lock()时会被阻塞,知道这个线程调用unlock()之后其它线程才会获得这个锁。
QSemaphore
信号量QSemaphore可以理解为对互斥量QMutex功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
一个例子
#include <QtCore/QCoreApplication>#include <QSemaphore>#include <QThread>#include <QMutex>#include <iostream>using namespace std;QSemaphore vacancy(5); //空位资源,QSemaphore produce(0); //产品数量QMutex mutex; //互斥锁int buffer[5]; //缓冲区可以放5个产品int numtaken=60;int takei=0;class Producer:public QThread{ public: void run();};void Producer::run() //生产者线程{ for(int i=0;i<60;i++) //生产60次产品 { vacancy.acquire(); //P(s1)操作原语 buffer[i%5]=i; printf("produced %d\n",i); produce.release(); //V(s2)操作原语 }}class Consumer:public QThread{ public: void run();};void Consumer::run() //消费者线程{ while(numtaken>1) { produce.acquire(); //P(s2)操作原语 mutex.lock(); //从缓冲区取出一个产品...多个消费者,不能同时取出,故用了互斥锁 printf("thread %ul take %d from buffer[%d] \n",currentThreadId(),buffer[takei%5],takei%5); takei++; numtaken--; mutex.unlock(); vacancy.release(); //V(s1)操作原语 }}int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); Producer producer; Consumer consumerA; Consumer consumerB; producer.start(); consumerA.start(); consumerB.start(); producer.wait(); consumerA.wait(); consumerB.wait(); return 0;}
参考链接:http://www.qtcn.org/bbs/read-htm-tid-18848.html
4 0
- Qt线程同步之一个生产者多个消费者
- 线程__wait_notifyAll__多个生产者__多个消费者
- Qt之线程同步(生产者消费者模式
- Qt之线程同步(生产者消费者模式
- JAVA 线程通信以及多个生产者消费者模型
- 生产者消费者--多个线程出现的问题
- 生产者消费者--多个线程出现的问题
- 生产者消费者模型--修改多个线程的情况
- 生产者消费者模型--2个线程
- 生产者、消费者 线程同步
- 线程同步--生产者消费者
- 多个生产者,多个消费者
- java 多线程,生产者消费者实现。适合多个生产者消费者线程;打印线程编号便于查看正确性
- Qt之线程同步(生产者消费者模式 - QWaitCondition)
- Qt之线程同步(生产者消费者模式 - QSemaphore)
- Java多线程 多个生产者和多个消费者实现同步 jdk1.4
- Java多线程 多个生产者和多个消费者实现同步 jdk1.5
- 黑马程序员——多个生产者,多个消费者 signalAll() JDK1.5线程新特性
- logstash 格式处理
- iOS iTunes Connect协议更新导致无法构建新版本
- GreenDao3.0+的配置使用以及数据库升级
- 新版本提示
- 使用Memcache实现Session共享(单点登录)的原理
- Qt线程同步之一个生产者多个消费者
- 01-Java常见的数据类型
- 关于cocoapods安装?
- 【数据结构】算法10.10-10.11 堆排序
- 编程思想:面向对象和面向过程
- 最小生成树(普利姆算法、克鲁斯卡尔算法)
- char varchar nchar nvarchar区别
- ionic开发
- Android——View的绘制