高级进程间通信之信号量详解
1. 信号量概述
信号量是一种用于防止两个或多个进程或线程同时访问共享资源的计数器。在 UNIX 中,“信号量”通常指通过系统调用操作以同步进程的对象,而“互斥锁”一般用于同步线程。
信号量分为二进制信号量和通用信号量:
- 二进制信号量只有锁定和解锁两种状态。
- 通用信号量有无限(或至少非常多)的状态,获取(锁定)时减 1,释放(解锁)时加 1,且值不能为负。
通用信号量通常通过 semwait 和 sempost 两个操作来访问,以下是用 C 语言实现的示例:
void semwait(int *sem)
{
while (*sem <= 0)
; /* do nothing */
(*sem)--;
}
void sempost(int *sem)
{
(*sem)++;
}
信号量必须通过调用 sempost 进行初始化,否则无法获取资源。例如,若信号量统计空闲缓冲区数量,初始有 5 个缓冲区,则需调用 5 次 sempost ,也可直接将信号量变量设为 5。
然而,上述实现的 semwait 和 sempost 无法正常工作,原因如下:
1. 信号量变量通常不在进程间共享,因为进程有不同的数据段(虽然可放在共享内存中)。
2. 函数执行不是原子操作
超级会员免费看
订阅专栏 解锁全文
2591

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



