头文件:#include <semaphore.h>
链接库 -pthread
函数原型:
int sem_init(sem_t *sem, int pshared, unsigned int value);
参数说明:
a. sem 为指向未初始化信号量结构的一个指针
b. pshared 参数表示这个信号量是在进程的线程之间共享, 还是在进程之间共享.
如果 pshared 的值为 0, 那么这个信号量会在进程的线程之间共享, 并且应该位于对所有线程都可见的某个地址
如果 pshared 非零, 那么这个信号量将在进程之间共享, 并且应该位于共享内存的某个区域 (参见 shm_open(3),
mmap(2) 和 shmget(2)).(因为 fork(2) 创建的子进程会继承父进程的内存映射, 所以它也可以获取信号量).
任何可以访问共享内存区域的进程都可以使用 sem_post(3),sem_wait(3) 等对这个信号量进行操作.
c. value 指定信号量的初始值
功能:
初始化信号量
返回值: 成功返回 0, 失败返回 - 1
函数原型:
int sem_destroy(sem_t *sem);
参数说明:
sem 为通过 sem_init(3) 初始化的信号量
功能:
释放信号量
返回值: 成功返回 0, 失败返回 - 1
函数原型:
int sem_post(sem_t *sem);
参数说明:
sem 为通过 sem_init(3) 初始化的信号量
功能:
sem_post 函数的作用是给信号量的值加上一个 "1", 它是一个 "原子操作"--- 即同时对同一个信号量做加 "1" 操作的两个线程是不会冲突的;
而同 时对同一个文件进行读, 加和写操作的两个程序就有可能会引起冲突. 信号量的值永远会正确地加一个 "2"-- 因为有两个线程试图改变它.
返回值: 成功返回 0, 失败返回 - 1
函数原型:
int sem_wait(sem_t *sem);
参数说明:
sem 为通过 sem_init(3) 初始化的信号量
功能:
sem_wait 函数也是一个原子操作, 它的作用是从信号量的值减去一个 "1", 但它永远会先等待该信号量为一个非零值才开始做减法.
也就是说, 如果你对 一个值为 2 的信号量调用 sem_wait(), 线程将会继续执行, 介信号量的值将减到 1. 如果对一个值为 0 的信号量调用 sem_wait(),
这个函数就 会地等待直到有其它线程增加了这个值使它不再是 0 为止. 如果有两个线程都在 sem_wait() 中等待同一个信号量变成非零值,
那么当它被第三个线程增加 一个 "1" 时, 等待线程中只有一个能够对信号量做减法并继续执行, 另一个还将处于等待状态.
返回值: 成功返回 0, 失败返回 - 1
来源: http://www.bubuko.com/infodetail-3719226.html