Qt线程的简单使用(四)——QSemaphore的使用

参考资料:示例来源    http://www.cnblogs.com/venow/archive/2012/10/15/2724943.html

Qt 帮助手册 QSemaphore

QSemaphore提供了一定数量的信号量。

一个 semaphore信号量是一种泛化的mutex。一个mutex只能被锁住一次,但是semaphore被获取多次。信号量通常被用于保护一定数量的同种资源。

Semaphore提供两种基本的操作,acquire() and release():

Acquire(n)尝试去n个资源。如果获取不到足够的资源,这个会一直锁住直到可以获取足够的资源。

Release(n)释放n个资源。

除了以上的方法,还有tryAcquire()函数,如果得不到足够的资源会立即返回,available()函数,返回在任意时刻可用的资源数目。

以下是一个生产者/消费者的例子,可以理解QSemaphore的具体使用

 1 #include <QtCore/QCoreApplication>
 2 #include <QSemaphore>
 3 #include <QThread>
 4 #include <iostream>
 5 #include <QTime>
 6
 7 const int DataSize = 100;
 8 const int BufferSize = 10;
 9 char buffer[BufferSize];
10 QSemaphore freeSpace (BufferSize);
11 QSemaphore usedSpace(0);
12 //1.BufferSize = 1 ,DataSize = 100,生产一个,消费一个。
13 //2.BufferSize = 100,DataSize = 100;先是大量生产。
14
15
16
17 //生产者
18 class Producer:public QThread
19 {
20 protected:
21     void run()
22     {
23         qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
24         qsrand(NULL);
25         for (int i = 0;i < DataSize;++i)
26         {
27             freeSpace.acquire();
28             std::cerr<<"P";
29             usedSpace.release();
30         }
31     }
32 };
33 //消费者
34 class Consumer:public QThread
35 {
36 protected:
37     void run()
38     {
39         for (int i = 0;i < DataSize;++i)
40         {
41             usedSpace.acquire();
42             std::cerr<<"C";
43             freeSpace.release();
44         }
45     }
46 };
47
48 int main(int argc, char *argv[])
49 {
50     QCoreApplication a(argc, argv);
51
52     Producer producer;
53     Consumer consumer;
54     producer.start();
55     consumer.start();
56     producer.wait();
57
58     consumer.wait();
59
60     return a.exec();
61 }
时间: 2024-08-29 09:57:57

Qt线程的简单使用(四)——QSemaphore的使用的相关文章

Qt线程的简单使用系列

Qt线程的简单使用(四)--QSemaphore的使用 Qt线程的简单使用(三)--通过一个实例理解QMutex的使用 Qt线程的简单使用(二)--通过继承QThread()创建线程 Qt线程的简单使用(一)--通过QObject::moveToThread()创建线程

Qt线程的简单使用(一)

Qt中线程的一种创建方式,就是使用QObject::moveToThread()函数.如下,直接上源代码,可以把费时的任务放到doWork()方法里进行,不阻塞主线程. 1 #ifndef WORKER_H 2 #define WORKER_H 3 4 #include <QObject> 5 6 class Worker : public QObject 7 { 8 Q_OBJECT 9 10 public: 11 Worker(); 12 ~Worker(); 13 public slot

Qt线程的简单使用(二)

Qt 中的线程的创建除了使用QObject::moveToThread()的函数以外,继承QThread(),重写其run()函数也是一种常见的方式.Qt 助手中,关于QThread的介绍中,有这样一段代码: 1 class AdvancedThreadManager : public QThread 2 { 3 protected: 4 void run() 5 { 6 /* ... other code to initialize thread... */ 7 8 // Begin even

Qt新建线程的方法(四种办法,很详细,有截图)

看了不少Qt线程的东西,下面总结一下Qt新建一个线程的方法. 一.继承QThread 继承QThread,这应该是最常用的方法了.我们可以通过重写虚函数void QThread::run ()实现我们自己想做的操作,实现新建线程的目的.前面已经介绍了Qthread,这里就不重复了. 这种方法,我们每一次要新建一个线程都需要继承Qthread,实现一个新的类,有点不太方便.但是相对于Qrunnable,这种方法的好处就是我们可以直接调用对象的start()函数启动线程,而Qrunnable必须借助

Qt同步线程(QMutex QMutexLocker QReadWriteLock QSemaphore QWaitCondition )

Qt同步线程 我们知道,多线程有的时候是很有用的,但是在访问一些公共的资源或者数据时,需要进行同步,否则会使数据遭到破坏或者获取的值不正确.Qt提供了一些类来实现线程的同步,如QMutex,QMutexLocker,QReadWriteLock,QReadLocker,QWriteLocker,QSemaphore和QWaitCondition.下面我们分别来看它们的用法: QMutex 首先,简单的了解一下QMutex提供的函数. 构造函数:QMutex ( RecursionMode mod

QT开发(三十四)——QT多线程编程

QT开发(三十四)--QT多线程编程 一.QT多线程简介 QT通过三种形式提供了对线程的支持,分别是平台无关的线程类.线程安全的事件投递.跨线程的信号-槽连接. QT中线程类包含如下: QThread 提供了开始一个新线程的方法    QThreadStorage 提供逐线程数据存储    QMutex 提供相互排斥的锁,或互斥量    QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁    QReadWriterLock 提供了一个可以同时读操作的锁    QReadL

QT核心编程之Qt线程 (c)

QT核心编程之Qt线程是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt对线程提供了支持,它引入了一些基本与平台无关的线程类.线程安全传递事件的方式和全局Qt库互斥量允许你从不同的线程调用Qt的方法.Qt中与线程应用相关的类如表6所示. 表6 Qt中与线程相关的类 使用线程需要Qt提供相应的线程库的支持,因此,在编译安装Qt时,需要加上线程支持选项. 当在Windows操作系统上编译Qt时,线程支持是在一些编译器上的一个

Qt 线程基础(QThread、QtConcurrent等) 2

使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线程时需要非常小心.启动线程是很容易的,但确保所有共享数据保持一致很难.遇到问题往往很难解决,这是由于在一段时间内它可能只出现一次或只在特定的硬件配置下出现.在创建线程来解决某些问题之前,应该考虑一些替代的技术 : 替代技术 注解 QEventLoop::processEvents() 在一个耗时的计

详解 Qt 线程间共享数据(用信号槽方式)

使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据从一个线程传递到另外一个线程. 第一种办法在各个编程语言都使用普遍,而第二种方式倒是QT的特有方式,下面主要学习一