信号量和互斥量 在linux下的API是什么?
在 Linux 中,信号量(Semaphore)和互斥量(Mutex)的 API 主要分为 POSIX 标准接口和 System V 接口。以下是它们的详细 API:
互斥量(Mutex)API
互斥量主要用于线程间的同步,其 API 主要基于 POSIX 线程库(pthread)。以下是常用的互斥量 API:
初始化互斥量
-
pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
:初始化互斥量。 -
pthread_mutex_destroy(pthread_mutex_t *mutex)
:销毁互斥量。
锁操作
-
pthread_mutex_lock(pthread_mutex_t *mutex)
:加锁,阻塞直到获取锁。 -
pthread_mutex_trylock(pthread_mutex_t *mutex)
:尝试加锁,若锁已被占用则立即返回。 -
pthread_mutex_unlock(pthread_mutex_t *mutex)
:解锁。
信号量(Semaphore)API
信号量分为有名信号量和无名信号量,分别用于进程间同步和线程间同步。
POSIX 信号量 API
-
有名信号量:
-
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value)
:创建或打开一个有名信号量。 -
int sem_close(sem_t *sem)
:关闭信号量。 -
int sem_unlink(const char *name)
:删除信号量。
-
-
无名信号量:
-
int sem_init(sem_t *sem, int pshared, unsigned int value)
:初始化无名信号量。 -
int sem_destroy(sem_t *sem)
:销毁无名信号量。
-
信号量操作
-
int sem_wait(sem_t *sem)
:P 操作,等待信号量值大于 0 并将其减 1。 -
int sem_trywait(sem_t *sem)
:尝试 P 操作,若信号量值为 0 则立即返回。 -
int sem_post(sem_t *sem)
:V 操作,增加信号量值。
System V 信号量 API
System V 信号量主要用于进程间同步,其 API 包括:
-
int semget(key_t key, int nsems, int semflg)
:创建或获取一个信号量集。 -
int semop(int semid, struct sembuf *sops, size_t nsops)
:对信号量执行 P 或 V 操作。 -
int semctl(int semid, int semnum, int cmd, ...)
:控制信号量集的属性,如删除信号量集。
总结
-
互斥量:主要用于线程同步,通过
pthread_mutex_*
系列函数操作。 -
信号量:用于线程或进程同步,POSIX 信号量通过
sem_*
系列函数操作,System V 信号量通过semget
、semop
和semctl
操作。