闲来无事,我给大家讲下UNIX/Linux下信号量函数的使用。
首先你得知道什么叫信号量,什么时候要用信号量。
这个嘛,主要就是用来保护共享资源的,也就是说如果你想限制某个(些)资源在同一时刻只能有一(多)个线程拥有,就可以使用信号量。当然也可以用作让一个线程等待另一个线程完成某项工作。
 
用下面一组函数(系统调用)来实现。
int sem_init(sem_t *sem,int pshared,unsigned int value); 
int sem_destroy(sem_t *sem); 
int sem_wait(sem_t *sem); 
int sem_trywait(sem_t *sem); 
int sem_post(sem_t *sem); 
int sem_getvalue(sem_t *sem); 
具体要Include什么头文件,在你的系统上man sem_init吧。
这组函数是POSIX标准的无名信号量函数,另外还有具名信号亮,这个嘛,等下回再说。
 
看一个例子,比如有两个线程都要往打印机上打东西,但是同一时刻只能打一个。
那么首先用sem_init初始化一个信号量,注意pshared表示允许几个进程共享该信号量,一般设0用于进程内的多线程共享,要看是否支持进程共享,请查看下你的系统的man手册。
第三个参数value表示可用的资源的数目,即信号灯的数目,咱们这儿只有1个打印机所以设成1。
然后线程调用sem_wait取获取这个信号灯,第一个线程一看,有1个,他就拿到了,然后可以继续后继操作,此时信号灯自动减1,变成0个。那么第二个线程调用sem_wait时就会阻塞在这儿了。
第一个线程完成打印后,调用sem_post释放信号灯,信号灯数目变成1,将会唤醒等待的第二个线程,然后第二个线程接着打印。
最后当所有任务完成后,主线程调用sem_destroy释放这个信号量。
 
OK?
另外几个函数sem_trywait ,顾名思义,望文生义,就是测试一下看看现在有没有可用的信号灯,而不会阻塞。
sem_getvalue嘛就是读取当前的信号灯的数目。

信号量sem_wait()的使用相关推荐

  1. 线程:信号量 sem_wait sem_post

    信号量的数据类型为结构sem_t,它本质上是一个长整型的数.函数sem_init()用来初始化一个信号量.它的原型为: extern int sem_init __P ((sem_t *__sem, ...

  2. 信号量sem_wait()函数的学习

    文章目录 一.信号量是什么? 二.使用步骤 1.用下面一组函数(系统调用)来实现对临界资源的访问 2.信号量实现顺序操作 3.信号量实现互斥操作 一.信号量是什么? 信号量(Semaphore),有时 ...

  3. linux POSIX 信号集,读书笔记:第10章 Posix信号量 (6)

    <UNIX网络编程:卷2>P203-P204:图10-33.10-34 生产者和消费者之间使用多个缓冲区 ----------------------------------------- ...

  4. Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题

    Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post ...

  5. linux c 网络编程与信号量,linux网络编程-----线程同步--信号量

    开发使用多线程过程中, 不可避免的会出现多个线程同时操作同一块共享资源, 当操作全部为读时, 不会出现未知结果, 一旦当某个线程操作中有写操作时, 就会出现数据不同步的事件. 而出现数据混乱的原因:资 ...

  6. Linux系统信号量实现生产者-消费者问题

    Linux系统信号量实现生产者-消费者问题 实现代码 #include<bits/stdc++.h> #include<unistd.h> #include<pthrea ...

  7. Linux C编程--线程操作2--线程同步详解

    linux线程同步之互斥 在windows中,为了让多个线程达到同步的目的,在对于全局变量等大家都要用的资源的使用上,通常得保证同时只能由一个线程在用,一个线程没有宣布对它的释放之前,不能够给其他线程 ...

  8. Linux经典问题—五哲学家就餐问题

    http://m.blog.csdn.net/aspenstars/article/details/70149038 一.问题介绍 由Dijkstra提出并解决的哲学家进餐问题(The Dinning ...

  9. cwinthread*线程指针怎么销毁结束_最新版Web服务器项目详解 01 线程同步机制封装类...

    点 击 关 注 上 方"两猿社" 设 为"置 顶 或 星 标",干 货 第 一 时 间 送 达. 互 联 网 猿 | 两 猿 社 基础知识 RAII RAII全称是"Resource Acq ...

最新文章

  1. SQL 全角半角转换-(摘抄)
  2. 这届架构师成功的理由,它排第一……
  3. Silverlight+WCF 新手实例 象棋 该谁下棋-B下A停(三十)
  4. php7 pdo mysql_PHP7添加pdo_mysql扩展
  5. 【实用工具】借助adb在android机上测试
  6. poj2513Colored Sticks(无向图判欧拉路、回路+trie树)
  7. java正则表达式爬图片_Java正则表达式爬取网页,贴出完整代码
  8. 云计算需要python吗_云计算开发学习笔记:Python的环境搭建
  9. 范式哈夫曼编码(Canonical Huffman Code)
  10. Java项目中使用OpenOffice转PDF
  11. 字节跳动常见算法面试题top50整理
  12. finereport与OA系统集成的完全方案
  13. 详解Java 堆排序
  14. 鲁大师2022年Q1季度电动车报告:市场不断细分,产品白刃战开启
  15. 高项、高级项目管理师论文-干系人管理
  16. el-form的入门学习
  17. Java 版spark Streaming 维护kafka 的偏移量
  18. 塞尔达传说顺序_您可能错过的有争议的塞尔达传说
  19. 期权:短期交易日内波动为主 静待市场情绪拐点
  20. java 只有try 不catch_Java异常处理只有Try-Catch吗?

热门文章

  1. 网站大流量高并发访问的处理解决办法
  2. Mysql数据库申请
  3. 并行执行,没用到过,写到这里免得搞忘
  4. vs2010 EF4.0 访问mysql
  5. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.2
  6. python实例31[解析buildlog]
  7. mysql 二叉树表设计_mysql---B+tree索引的设计原理
  8. 广联达2018模板算量步骤_广联达gtj2021实操案例,新增6大板块,快速提高算量效率...
  9. springboot不会运行gc_SpringBoot 和JVM 调优(深度好文,建议收藏)
  10. cbrt c语音_isgraph - [ C语言中文开发手册 ] - 在线原生手册 - php中文网