Linux -- 进程间通信之信号量
2024-10-09 14:02:10
基本概念简述
多个线程同时访问一个共享数据,很可能造成恶劣的后果;为了保证数据访问资源的正确性和安全性,需要对线程进行"同步"
(Linux下所有的执行实体都称为任务(task),每个任务类似于单线程的进程,共享了同一个内存空间的多个任务构成了一个进程)
- 同步
指在一个线程对数据访问未结束的时候,其他线程不得访问同一个数据,将对数据的访问原子化
- 原子操作
不可分割,不会被线程调度打断的操作
(一个程序在运行的过程中可能被优先级更高的线程中断,而有些操作是不可中断的,不然会出现无法还原的后果,这时候操作系统就需要原子操作)
线程同步
同步最常用的方式"锁",每一个线程访问数据或资源前首先要获取锁,并在访问结束后释放锁;在锁被占用时试图获取锁,线程会进入等待,直到锁重新可用
二元信号量是最简单的一种锁,适合被一个线程独占访问的资源。它只有两种状态,占用和非占用;当一个线程获取锁后,其他线程试图获取锁将进入等待,直到该锁被释放。
互斥量类似于二元信号量,资源同时只允许一个线程访问,不同的是信号量在整个系统中允许任何线程获取并释放,即信号量可以被系统中一个线程获取,然后由另一个线程释放它;而互斥锁要求哪个线程获取互斥量,这个线程就要负责释放这个锁,其他线程释放该互斥量是无效的
- 临界资源
一次仅允许一个进程访问的资源称为临界资源,通常用互斥量控制临界资源的访问
P(测试)/ V(增加)操作
对于允许多个线程并发访问的锁成为多元信号量,简称信号量,一个初始值为N的信号量允许N个线程同时访问,线程访问资源首先获取信号量,进行如下操作(P):
- 将信号量的值减 1
- 如果信号量的值小于 0,则进入等待
访问完资源后,线程释放信号量,进行如下操作(V):
- 将信号量的值加 1
- 如果信号量的值小于 1,唤醒一个等待中的线程
最新文章
- jquery mobile开发中footer一直在底部的设置方法
- day4总结
- android接入微信分享(朋友、朋友圈)、QQ分享(好友、空间)
- Spring 使用中的设计模式
- 服务器之间socket传输单链接和多连接测试结果
- 你需要知道的九大排序算法【Python实现】之归并排序
- Ubuntu 12.04 搭建 Eclipse Android 开发环境(转)
- 洛谷 [P3258] 松鼠的新家
- linux 50个常用命令
- java中hashCode()与equals()详解
- 利用jmap和MAT等工具查看JVM运行时堆内存
- Pocket Gems面经prepare: Diamond and Ruby
- go语言语法基础
- hash 在 perl 中的用法(转载)
- Java gc中的那些事
- RobotFramework测试问题二:各种元素不能定位问题
- ie请求缓存问题,页面内容没有及时更新
- uvalive 3415 Guardian Of Decency
- 背水一战 Windows 10 (49) - 控件(集合类): Pivot, Hub
- IDEA 之 Error during artifact deployment. See server log for details