sem_t
信号量是一种变量,其访问是原子操作(不可中断的一个或者一系列操作, 运行期间不会有任何的上下文切换)的,其头文件为:
#include <semaphore.h>
其主要作用如下:
1、等待信号量,当信号量是0的时候,程序阻塞等待。可以调用相关操作,使信号量加1,当信号量 > 0 的时候,程序就可以继续运行了。
sem_wait(&sem);
2、发送信号量,其作用是让信号量的值+1。实现线程的同步控制。
sem_post(&sem);
常见的函数
sem_init()
#include <semaphore.h>
int sem_init(sem_t *sem,int pshared,unsigned int value);
作用:对由sem指定的信号量进行初始化,设置好它的共享选项,并指定一个整数类型的初始值。pshared参数控制着信号量的类型。如果 pshared的值是0,就表示它是当前进程的局部信号量;否则,其它进程就能够共享这个信号量。只对不让进程共享的信号量感兴趣。Linux线程一般不支持进程间共享信号量,pshared传递一个非零将会使函数返回ENOSYS错误。
-
sem_post(sem_t *sem);
作用:给信号量的值加上一个“1”,(原子操作,同时对同一个信号量做加“1”操作的两个线程是不会冲突的) -
sem_wait(sem_t *sem);
作用:从信号量的值减去一个“1”(原子操作),但它会先等待该信号量为一个非零值才开始做减法。 -
sem_getvalue(sem_t *sem,int *valp)
作用:获取sem的值,并保存在valp中。 -
sem_destory(sem_t *sem)
作用:用完信号量对它进行清理。