int sem_getvalue(sem_t *sem, int *sval);
BBB 取回信号量 sem 的当前值,把该值保存到 sval 中。
BBB 若有 1 个或更多的线程或进程调用 sem_wait 阻塞在该信号量上,该函数返回两种值:
BBB BBB 1) 返回 0
BBB BBB 2) 返回阻塞在该信号量上的进程或线程数目
BBB linux 采用返回的第一种策略。
sem_wait(或 sem_trywait)相当于 P 操作,即申请资源。
int sem_wait(sem_t *sem); // 这是一个阻塞的函数
BBB 测试所指定信号量的值,它的操作是原子的。
BBB 若 sem>0,那么它减 1 并立即返回。
BBB 若 sem==0,则睡眠直到 sem>0,此时立即减 1,然后返回。
int sem_trywait(sem_t *sem); // 非阻塞的函数
BBB 其他的行为和 sem_wait 一样,除了:
BBB 若 sem==0,不是睡眠,而是返回一个错误 EAGAIN。
sem_post 相当于 V 操作,释放资源。
int sem_post(sem_t *sem);
BBB 把指定的信号量 sem 的值加 1;
BBB 呼醒正在等待该信号量的任意线程。
注意:在这些函数中,只有 sem_post 是信号安全的函数,它是可重入函数
(a)无名信号量在多线程间的同步
无名信号量的常见用法是将要保护的变量放在 sem_wait 和 sem_post 中间所形成的
临界区内,这样该变量就会被保护起来,例如:
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int number; // 被保护的全局变量
sem_t sem_id;
void* thread_one_fun(void *arg)
{
sem_wait(&sem_id);
printf("thread_one have the semaphore\n");
number++;