11-未命名信号量
53.4 未命名信号量
未命名信号量(也被称为基于内存的信号量)是类型为sem_t并存储在应用程序分配的内存中的变量。通过将这个信号量放在由几个进程或线程共性的内存区域中就能够使这个信号量对这些进程或线程可用。
操作未命名信号量所使用的函数与操作命名信号量使用的函数是一样的(sem_wait()、sem_post()以及sem_getvalue()等)。此外,还需要用到另外两个函数。
- sem_init()函数对一个信号量进行初始化并通知系统该信号量会在进程间共享还是在单个进程中的线程间共享。
- sem_destroy(sem)函数销毁一个信号量。
这些函数不应该被应用到命名信号量上。
未命名与命名信号量对比
使用未命名信号量之后就无需为信号量创建一个名字了,这种做法在下列情况中是比较有用的。
- 在线程间共享的信号量不需要名字。将一个未命名信号量作为一个共享(全局或堆上的)变量自动会使之对所有线程可访问。
- 在相关进程间共享的信号量不需要名字。如果一个父进程在一块共享内存区域中(如一个共享匿名映射)分配了一个未命名信号量,那么作为fork()操作的一部分,子进程会自动继承这个映射,从而继承这个信号量。
- 如果正在构建的是一个动态数据结构(如二叉树),并且其中的每一项都需要一个关联的信号量,那么最简单的做法是在每一项中都分配一个未命名信号量。为每一项打开一个命名信号量需要为如何生成每一项中的信号量名字(唯一的)和管理这些名字设计一个规则(如当不再需要它们时就对它们进行断开链接操作)。