POSIX IPC有名信号量(进程间同步互斥)

(1)概述
___1.理论与SYSTE-V一样, 但在IPC上进行了封装, 和在文件系统上进行了扩展
___2.POSIX 信号量和 System V 信号量的作用是相同的,都是用于同步进程之间及线程之间的操作,以达
到无冲突地访问共享资源的目的。
___3.POSIX 信号量的作用和 System V 信号量是一样的。但是两者在接口上有很大的区别:
·POSIX 信号量将创建和初始化合二为一
·一次只能修改一个信号量。System V 信号量其本质是信号量集,一次可以修改多个信号量。
·POSIX 信号量一次只能将信号量的值加 1 或减 1 。System V 信号量能够加上或减去一个大于 1 的值。
·POSIX 信号量并没有提供一个等待信号量变为 0 的接口, System V 信号量中, semop 函数则提供了这样的接口
·POSIX 信号量并没有提供 UNDO 操作,而 System V 信号量则提供了这样的操作。
___4.POSIX 信号量真正比 System V 信号量优越的地方在于, POSIX 信号量性能更好。
对于 System V 信号量而言,每次操作信号量,必然会从用户态陷入内核态时间上的开销很大
POSIX 信号量,只要不存在真正的两个线程争夺一把锁的情况,那么修改信号量就只是用户态的操作,并不会牵扯到内核。
在竞争并不激烈的情况下, POSIX 的性能要远远高于 System V 信号量。
___5.POSIX 提供了两类信号量:有名信号量和无名信号量。
1.无名信号量,又称为基于内存的信号量,由于其没有名字,没法通过 open 操作直接找到对应的信号量,
所以很难直接用于没有关联的两个进程之间。无名信号量多用于线程之间的同步。
2.有名信号量由于其有名字,多个不相干的进程可以通过名字来打开同一个信号量,从而完成同步
操作,所以有名信号量的操作要方便一些,适用范围也比无名信号量更广。

(2)创建.打开.初始化信号量
sem_t *sem_open(const char *name, int oflag,mode_t mode, unsigned int value);
第二个参数 oflag 标志位支持的标志包括 O_CREAT 和 O_EXCL 标志位。如果带了 O_CREAT 标志位,则表示要创建信号量。
mode 表示创建的新信号量的访问权限
value 是新建信号量的初始值。创建和赋初值都是由一个接口来完成的
1.不要尝试创建 sem_t 结构体的副本,切记,后面所有的调用都要用通过 sem_open 返回的 sem_t 类型的指针来进行操作,而不能使用结构体的副本。
2.当 sem_open 函数失败时,返回 SEM_FAILED

(3)打开信号量
sem_t *sem_open(const char *name, int oflag);
(4)关闭信号量

int sem_close(sem_t *sem);

(5)删除信号量
int sem_un (const char *name);

(6)注意
如果程序结尾没有删除Posix信号量, 第二次运行时就只会打开前面创建的信号量;
而信号量的初值是在信号量创建时设置的;
==> 第二次运行时,信号量的初值可能不是我们想要的

//我会选好合适的例子再修改博文

收藏 打印