一、信号量的初步认识

可以把信号量理解为加强版的互斥锁
对于互斥锁:
pthread_mutex_init () 初始化 一把互斥锁后 :mutex = 1 ,代表有一把互斥锁可用。
pthread_mutex_lock (), 加锁 :mutex = 0 ,只有拥有锁的线程(个数=1)可以访问共享数据。
pthread_mutex_unlock (),解锁 :mutex = 1 ,其他线程继续抢锁。
这就意味着,互斥锁实现的同步是串行的。
对于信号量:
其实对互斥锁进行了封装,使得 mutex > 1,意味着可以允许多个线程同时访问多个共享变量,即,信号量实现的同步是并行的。

二、信号量的相关函数

头文件: #include <semaphore.h>
编译需要加 -pthread
返回值(所有函数都一样):
成功 : 0
失败 : -1
(1)定义信号量:

sem_t sem

(2)初始化信号量:

int sem_init(sem_t *sem, int pshared, unsigned int value);

参数 1 :定义的信号量地址。
参数 2 :0 – 线程同步 1 – 进程同步。
参数 3 :最多有几个 线程/进程 操作共享数据。
(3)加锁:

int sem_wait(sem_t *sem);

注意:查看 sem 值,如果 > 0,调用一次,相当于对 sem 做减一操作(跟互斥锁一样)如果 sem=0,线程就会阻塞。
(4)尝试加锁:

 int sem_trywait(sem_t *sem);

注意:同样,会引起 sem 做减一操作,但 sem=0 时候,线程不才会阻塞,会直接返回。
(5)解锁:

 int sem_post(sem_t *sem); // 对 sem 做++操作

(6)销毁信号量:

 int sem_destroy(sem_t *sem);

Linux学习之系统编程篇:信号量(sem_init / wait / trywait / post / destroy)相关推荐

  1. Linux学习之系统编程篇:使用信号量实现“生产者和消费者模型”

    模型中,最为关键的步骤是,在生产者回调函数中,未生产之前,消费者回调函数是阻塞的,阻塞方式是条件变量. 那么不使用条件变量,如何使用"信号量"实现阻塞呢? 答案是因为调用 sem_ ...

  2. Linux学习之系统编程篇:ps 和 kill 命令以及父子进程间数据共享模式

    一.ps 和 kill 命令 1.ps 命令 常用方式: ps aux :查看正在运行进程信息(主要查 pid). ps ajx :更加详细(PID. PPID:父进程 id. PGID:进程组 id ...

  3. Linux学习之系统编程篇:对线程的基本认识

    (1)fork()后创建的子进程是父进程的拷贝,那么pthread_create,创建线程,创建的线程跟原进程有什么关系呢? fork 会通过拷贝产生新的虚拟地址空间(PCB 会变化),而 pthre ...

  4. Linux学习之系统编程篇:编写一个守护进程

    需求:写一个守护进程,每隔 2s 获取一次系统时间,将这个时间写入到磁盘文件 #include <stdio.h> #include <stdlib.h> #include & ...

  5. Linux学习之系统编程篇:守护进程(精灵进程、后台进程)

    一.背景 一般情况下,启动终端(shell),系统会创建一个会话(shell 进程是会长),经过后续各种操作,该会话中会存在多个进程组,每个进程组中也会有多个进程(父进程是组长),若此时关闭 shel ...

  6. Linux学习之系统编程篇:shm 共享内存及其操作函数

    一.shm 和 mmap 的区别 (1)mmap 是在磁盘上建立一个文件,每个进程地址空间中开辟出一块空间进行映射.shm 每个进程最终会映射到同一块物理内存.shm 保存在物理内存,这样读写的速度最 ...

  7. Linux学习之系统编程篇:IPC 和管道的基本概念及管道的创建

    一.IPC 概念 IPC: 进程间通信. 进程间通信的常见的 4 中方式: (1)管道 pipe fifo :最简单(但只能在有血缘关系下进行). (2)信号 signal : 属于系统的,所以系统开 ...

  8. Linux学习之系统编程篇:exec 函数族

    函数能力:"换核不换壳"(能够替换进程虚拟地址空间中.text 代码段). 作用:让父子进程执行不相干的操作. 效果:有一个运行的程序 A,在 A 中调用另一个程序 B,程序有父子 ...

  9. Linux学习之系统编程篇:MMU(Memory Manager Unit 内存管理单元)

    一.虚拟内存地址 对应于上图的两端,其中 0 - 3G 是用户区 ,3 - 4G 是内核区.编码的内存地址都是虚拟地址. 在3G到4G之间是PCB 进程控制块.从3G到0依次为: (1)命令行参数 和 ...

最新文章

  1. dedecms织梦获得首字母或拼音的方法,并实现文章列表按首字母归类
  2. php根据IP获取所有地,腾讯IP API
  3. Python apply函数
  4. xa协议 mysql_分布式事务XA实现数据一致性的协议与原理
  5. [LeetCode] Invert Binary Tree - 二叉树翻转系列问题
  6. linux加密框架 crypto 算法管理 - 算法检测
  7. python将print内容输入txt_Python将矩阵写入txt文件,保持格式
  8. RN学习笔记01:概述、特点与环境搭建
  9. notepad快捷键大全
  10. Udp---模拟实现客户端与服务器通信
  11. Linux之操作系统杂谈
  12. 文件上传4-uploads靶场6-10
  13. 谈谈自信,为什么自信是成功的第一秘诀?
  14. 实现虚拟机与板卡/树莓派网络互联,并通过笔记本wifi共享上网
  15. 请问mysql数据类型是否区分大小写?
  16. 接口练习:猫狗案例扩展跳高功能
  17. google 的高级搜索
  18. HashMap底层源码解析
  19. 电气-接触器与空气开关
  20. 《拾叶集》一个会写诗的程序员 二零一八年十月十日 ​​​

热门文章

  1. php中文网第七期课程目录,php中文网第七期
  2. 让机器学会看图说话:Image Caption任务最新综述
  3. 调参,注意神经网络处于哪种相态
  4. 热门的模型跨界,Transformer、GPT做CV任务一文大盘点
  5. flask与js交互的示例代码_dapr实战(1):dapr locally环境的搭建和部署官方的Hello world示例...
  6. Java实现图片转PDF
  7. JAVA——Unicode编码格式工具类
  8. 巴什博奕(Bash_Game)
  9. Ehab and a 2-operation task
  10. spring整合dubbo服务消费和发现入门示例