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

最新文章

  1. Atitit 游戏的原理与概论attilax总结
  2. 【VS】vs修改大小写快捷键
  3. [原创]Centos7 从零编译Nginx+PHP+MySql
  4. PHP导出数据到Excel
  5. 关于【bootstrap modal 模态框弹出瞬间消失的问题】
  6. Escape Sequences in String
  7. 应用程序的关闭退出(在FMX中,Activity替代了Form的概念)
  8. stm32之CAN发送、接收详解
  9. 如何设置ubuntu自己主动的睡眠时间
  10. (简单) POJ 3468 A Simple Problem with Integers , 线段树+区间更新。
  11. WLAN高密无线网络部署的信道问题
  12. jemter+ant+jenkins进行集成测试
  13. python3 re模块
  14. HTML 中使用 JavaScript
  15. https创建请求UrL报错: 未能为 SSL/TLS 安全通道建立信任关系
  16. MATLAB——线性神经网络
  17. xss攻击问题以及如何防范
  18. 201621123018《Java程序设计》第10周学习报告
  19. Java 正则表达式(精华)
  20. Linux基础命令---mknod

热门文章

  1. springboot内置tomcat验证授权回调页面域名
  2. win7(64位)彻底卸载mysql,重装不再烦恼
  3. win7 UAC bypass(微软已经给予了三组组件绕过UAC启动的特权)
  4. SQLyog 报错2058 :连接 mysql 8.0.12 解决方法
  5. atitit.提高开发效率---mda 革命性的软件开发方法
  6. R 语言基本操作(基本信息的查看、与本地文件系统交互、编译器版本升级)
  7. Android Handler、Message完全解析,带你从源码的角度彻底理解
  8. 随机森林与 GBDT
  9. python3操作注册表设置/取消IE代理
  10. blockchain_eth客户端安装 &amp; geth使用 &amp;批量转账(一)