申明:本学习笔记是在该教程的基础上结合自己的学习情况进行的总结,不是原创,想要看原版的请看C语言中文网的多线程编程(C语言+Linux),该网站有很多好的编程学习教程,尤其是关于C语言的。
信号量(Semaphore)的概念最早由荷兰计算机科学家 Dijkstra(迪杰斯特拉)提出,有时又称“信号灯”。本节,我们将详细地讲解如何使用信号量实现线程同步。
和互斥锁类似,信号量本质也是一个全局变量。不同之处在于,互斥锁的值只有 2 个(加锁 “lock” 和解锁 “unlock”),而信号量的值可以根据实际场景的需要自行设置(取值范围为 ≥0)。更重要的是,信号量还支持做“加 1”或者 “减 1”运算,且修改值的过程以“原子操作”的方式实现。
原子操作是指当多个线程试图修改同一个信号量的值时,各线程修改值的过程不会互相干扰。例如信号量的初始值为 1,此时有 2 个线程试图对信号量做“加 1”操作,则信号量的值最终一定是 3,而不会是其它的值。反之若不以“原子操作”方式修改信号量的值,那么最终的计算结果还可能是 2(两个线程同时读取到的值为 1,各自在其基础上加 1,得到的结果即为 2)。
多线程程序中,使用信号量需遵守以下几条规则:
- 信号量的值不能小于 0;
- 有线程访问资源时,信号量执行“减 1”操作,访问完成后再执行“加 1”操作;
- 当信号量的值为 0 时,想访问资源的线程必须等待,直至信号量的值大于 0,等待的线程才能开始访问。
根据初始值的不同,信号量可以细分为 2 类,分别为二进制信号量和计数信号量:
- 二进制信号量:指初始值为 1 的信号量,此类信号量只有 1 和 0 两个值,通常用来替代互斥锁实现线程同步;
- 计数信号量:指初始值大于 1 的信号量,当进程中存在多个线程,但某公共资源允许同

本文详细介绍了信号量的概念、用法及其在多线程编程中的应用。信号量作为线程同步的一种机制,允许自定义初始值,并支持原子性的加减操作。文中通过二进制信号量和计数信号量的例子,展示了如何使用信号量实现资源的访问控制,以及在「售票员卖票」和「银行办理业务」场景中的应用。
最低0.47元/天 解锁文章
2475

被折叠的 条评论
为什么被折叠?



