Qt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。

  下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:

#include <QtCore/QCoreApplication>
#include <QSemaphore>
#include <QThread>
#include <iostream>
#include <QTime> const int DataSize = 100;
const int BufferSize = 1;
char buffer[BufferSize]; QSemaphore freeSpace(BufferSize);
QSemaphore usedSpace(0); class Producer : public QThread
{
protected:
void run()
{
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
qsrand(NULL);
for (int i = 0; i < DataSize; ++i)
{
freeSpace.acquire();
std::cerr<<"P";
usedSpace.release();
}
}
}; class Consumer : public QThread
{
protected:
void run()
{
for (int i = 0; i < DataSize; ++i)
{
usedSpace.acquire();
std::cerr<<"C";
freeSpace.release();
}
std::cerr<<std::endl;
}
}; int main(int argc, char *argv[])
{
Producer producer;
Consumer consumer;
producer.start();
consumer.start();
producer.wait();
consumer.wait();
return 0;
}

  当DataSize = 100, BufferSize  = 1时,程序运行的界面如下,结果是可以预期的。生产者每次生产一个,消费者就消费一个。

  当DataSize = 100, BufferSize  = 10时,程序运行的界面如下,结果是不可预期的。这里只是列举两种情况。

  情况之一:

  情况之二:

http://www.cnblogs.com/venow/archive/2012/10/15/2724943.html

Qt信号量QSemaphore(在线程里使用,结合生产者消费者的问题)的更多相关文章

  1. python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式

    (1)锁:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 虽然使用加锁的形式实现了 ...

  2. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

  3. python进阶:Python进程、线程、队列、生产者/消费者模式、协程

    一.进程和线程的基本理解 1.进程 程序是由指令和数据组成的,编译为二进制格式后在硬盘存储,程序启动的过程是将二进制数据加载进内存,这个启动了的程序就称作进程(可简单理解为进行中的程序).例如打开一个 ...

  4. java线程之多个生产者消费者

    温故一下上一节所学习的生产者消费者代码: 两个线程时: 通过标志位flag的if判断和同步函数互斥较好解决两个线程,一个生产者.一个消费者交替执行的功能 类名:ProducterConsumerDem ...

  5. 线程同步介绍及 生产者消费者问题举例 C#版

    现在有五个工人在果园摘水果,一次只能摘一个,摘下的水果放入一个框中,这种框最多只能装50个橘子,一共有两个这样的框.当一个工人装框时,其他工人不能在使用这个框.当两个框都装满了,工人只有等框里有剩余位 ...

  6. java线程之多个生产者消费者2.0

    上一节中,通过while和notifyAll解决了多个生产者,消费者对共享资源的访问问题,现在开始升级 但是,仍然有改进之处,主要体现在两点: 1)使用新版本1.5开始后的锁Lock解决,目的将其全部 ...

  7. 基于线程池的线程管理(BlockingQueue生产者消费者方式)实例

    1.线程池管理类: public class ThreadPoolManager { private static ThreadPoolManager instance = new ThreadPoo ...

  8. 线程_FIFO队列实现生产者消费者

    import threading # 导入线程库 import time from queue import Queue # 队列 class Producer(threading.Thread): ...

  9. Ruby:线程实现经典的生产者消费者问题

    运行结果: ProAndCon 0 produced 1 produced consumed 0 2 produced 3 produced consumed 1 consumed 2 consume ...

随机推荐

  1. MySQL实现类似Oracle中的nextval和currval

    CREATE TABLE `sequence` ( `seq_name` varchar(50) NOT NULL, `current_val` int(11) NOT NULL, `incremen ...

  2. #上海ORACLE用户组2014在论坛#时刻

    #上海ORACLE用户组2014年高峰论坛#精彩瞬间 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXNrbWFjbGVhbg==/font/5a6L5L ...

  3. Arcgis api for javascript学习笔记(4.6版本) - 二维MapView中的FeatureLayer显示标注

    4.6版本api的FeatureLayer中有提供 labelsVisible 和 labelingInfo 两个属性,设置这两个属性可以实现显示将属性中某个字段作为标注.但是这两个属性只针对三维Sc ...

  4. exec 与 open 打开进程

    1 exec ?-keepnewline ?-ignorestderr  args(?号后面表示可以跟的参数) 这个东西一旦执行 , 没有执行完毕父进程会处于等待中 使用一个或多个子进程运行 由arg ...

  5. Android能够获取到唯一的设备ID吗?

    Android是否有唯一的设备ID,如果有的话,该怎样快速有效获取? Settings.Secure#ANDROID_ID 返回Android ID ,是一个64位的16进制字符串 1 2 3 imp ...

  6. java 中的两个常用命令

    这两个命令,分别为,javac 和java 实际操作如下图:

  7. NoSQL Manager for MongoDB 破解

    删除这两个地方的东西就好了 运行 -->regedit HKEY_CURRENT_USER\Software\NoSQL Manager Group 删除该文件夹 C:\ProgramData\ ...

  8. 动态加载Dll时,通过Type生成类对象

    原文:动态加载Dll时,通过Type生成类对象 转:http://www.cnblogs.com/zfanlong1314/p/4197383.html "反射"其实就是利用程序集 ...

  9. 【C语言学习】C语言功能

    代码,功能为了更好地实现模块化编程.那么,什么是函数的性质?在函数中定义的变量(全局变量.局部变量.静态变量)如何存储?为什么范围和全局变量和局部变量的寿命是不一样的?只是有一个更深入的了解的功能.能 ...

  10. 怎样从一名程序员过度到项目经理(整理自csdn论坛) 选择自 whoopee 的 Blog

    1.从程序员到PM,是一条脱变的路,事实上程序员走的路最终不应该是项目经理.首先有一点需要明白的就是,一定规模的项目中,项目经理不需要太懂技术,他可以是一知半解.项目经理的任务不是在技术方面,技术相关 ...