IPC之Posix信号量详解


基本概念:

信号量(semaphore)是一种用于提供不同进程间或一个给定进程的不用线程间同步手段的原语。

共有三种类型的信号量:

1)Posix有名信号量:使用Posix IPC名字标识,可用于进程或线程间的同步。

2)Posix基于内存的信号量:存放在共享内存区中,可用于进程或线程间的同步。

3)System V信号量:在内核中维护,可用于进程或者线程间同步。(本文不讨论System V信号量)


一个进程可以在某个信号量上执行三种操作:

(1)创建(create)一个信号量。这还要求调用者指定初始值。

(2)等待(wait)一个信号量。该操作会测试这个信号量的值,如果其值小于或等于0,那就等待(阻塞),一旦值变为大于0就将它减1,这两个步骤是一个原子操作。

(3)挂出(post)一个信号量。该操作将信号量的值加1,挂出操作同样是原子的。


Posix.1基本原理一文声称。有了互斥锁和条件变量还提供信号量的原因是:“本标准提供信号量的主要目的是提供一种进程间同步方式。这些进程可能共享也可能不共享内存区。互斥锁和条件变量是作为线程间的同步机制说明的,这些线程总是共享(某个)内存区。这两者都是已广泛使用了多年的同步范式。每组原语都特别适合于特定的问题”。


尽管信号量的意图在于进程间同步,互斥锁和条件变量的意图则在于线程间同步,但是信号量也可用于线程间,互斥锁和条件变量也可用于进程间。我们应该使用适合具体应用的那组原语。


上面提到Posix提供两类信号量:有名(named)信号量和基于内存的(memory-based)信号量,后者也称为无名(unnamed)信号量。图10-6比较了这两类信号量使用的函数。



图10-2是Posix有名信号量的图示:



图10-7展示了某个进程内由两个线程共享的一个Posix基于内存的信号量:



图10-8展示了某个共享内存区中由两个进程共享的一个Posix基于内存的信号量。图中画出该共享内存区属于这两个进程的地址空间。



多线程编程通常使用互斥锁、读写锁、条件变量、自旋锁,所以下面不再对基于内存的信号量展开。


下面讨论下Posix有名信号量编程:


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值