1. 简述
Linux的同步于互斥大致可以分为三个方式,分别是互斥锁,条件变量和信号量。他们针对不同的应用场景而被设计出来,其中互斥锁主要用于对共享资源的保护,条件变量用于控制操作的顺序,而信号量则用来控制对共享资源的访问数量。
Linux信号量是一种用于进程间同步和互斥的低级同步机制。信号量可以在多个进程或线程之间协调对共享资源的访问。在Linux中,主要有两种信号量:POSIX信号量和System V信号量。它们各自有不同的特性和用途。
2. POSIX与System V信号量
目前我们在Linux系统中常用的信号量主要有两种,分别是POSIX信号量和System V信号量。他们各自有对应的特点和应用场景。
POSIX:主要用于线程间的同步(无名信号量),也可以用在进程间(有名信号量)。
System V:常作为一种IPC机制,应用在进程间实现同步。
综上,我们常说线程间实现同步和互斥,进程间通信都有信号量存在。
线程间同步和互斥手段:互斥锁、信号量、条件变量;
进程间通信(IPC):套接字、共享内存、消息队列、信号、信号量、管道;
3. POSIX信号量
我们在前面已经讲过,POSIX信号量既可以用在线程间也可以用在进程间同步,但实际上我们使用的形式是不一样的。
POSIX信号量有两种:
无名信号量:基于内存的信号量,存储在内存中,一般用于线程间的同步;
有名信号量:基于系统文件的信号量,依赖于系统中的文件,一般用于进程间的同步,有名信号量一般用在关联进程间的通信,如通过fork实现的多进程;
(1)无名信号量
无名信号量寄生于内存中,用于线程间同步。具体的API如下所示。
首先要引入相关头文件:
#include <fcntl.h> /* For O_* constants */
#include <sys/stat.h> /* For mode constants */
#include <semaphore.h>
初始化信号量
&nb