30、高级进程间通信之信号量详解

高级进程间通信之信号量详解

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. 函数执行不是原子操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值