Qt线程同步之一个生产者多个消费者
2016-10-11 14:36
295 查看
QMutex
QMutex类提供的是线程之间的访问顺序化。
QMutex的目的是保护一段代码,使得同一时间只有一个线程可以访问它。但在一个线程中调用lock(),其它线程将会在同一地点试图调用lock()时会被阻塞,知道这个线程调用unlock()之后其它线程才会获得这个锁。
QSemaphore
信号量QSemaphore可以理解为对互斥量QMutex功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
一个例子
参考链接:http://www.qtcn.org/bbs/read-htm-tid-18848.html
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
相关文章推荐
- 利用线程的同步和互斥解决两个消费者两个生产者一个临界区问题
- Qt线程同步一个生产者多个消费者的实现
- 多个生产者-一个消费者-进程间同步的例子 - OutputDebugString的实现
- 多线程---使用ManualResetEvent来控制线程间的同步(实现了消费者和生产者模式)
- 一个生产者多个消费者问题
- 线程同步之生产者消费者
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结
- [java线程同步]生产者消费者问题demo
- 用C#线程技术模拟“生产者-消费者”经典进程同步问题
- java线程同步经典——生产者消费者
- 一个可以重用的线程安全生产者消费者队列类
- Java线程同步:生产者-消费者 模型(代码示例)
- 每天学习一算法系列(31)(实现一个队列,队列的应用场景为:一个生产者线程将int 类型的数入列,一个消费者线程将int 类型的数出列)
- C#的多线程机制探索(三)—线程的同步和通讯(生产者和消费者)
- JAVA 线程通信以及多个生产者消费者模型
- 同步线程--生产者与消费者模式
- 学习和理解JAVA线程同步--生产者与消费者例子
- 线程经典代码一,(未同步情况下的生产者/消费者关系)
- JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池
- 一个生产者一个消费者的无锁队列,多个生产者多个消费者的无锁队列