头文件:include <semaphore.h>
主要的函数:
1.初始化信号量
函数原型:int sem_init(sem_t* sem,int pshared,unsigned int value)
参数:
sem:
指定是哪一个信号量
pshared:
指定信号量的类型,值为0表示是在当前进程使用的局部信号量,否则该信号量就可以在多个进程中共享。
value:
指定信号量的初始值,可以理解为最多由多少个线程可以访问共享资源。
返回值:
2.销毁信号量
函数原型:int sem_destroy(sem_t* sem)
函数功能:释放信号量占用的内核资源,注意不能释放正在被线程其他等待的信号量,否则会出现错误。
返回值:
3.加锁
函数原型:int sem_wait(sem_t* sem)
函数功能:对信号量的值value
进行-1操作,相当于p操作。如果value的值为0,会发生阻塞。
4.尝试加锁
函数原型:int sem_trywait(sem_t* sem)
函数功能:对信号量的值value
进行-1操作,相当于p操作。如果value的值为0,会立即返回,不发生阻塞。
5.解锁
函数原型:int sem_post(sem_t* sem)
函数功能:对信号量的值value
进行 1操作,相当于v操作。当信号量的值value大于0时,其他调用sem_wait()正在等待信号量的线程将被唤醒。
线程级信号量相对于互斥锁对于线程的控制尺度更大,在sem_init()第三个参数可以控制同时访问共享资源的线程的个数,通过这个参数,可以实现同步控制、互斥、以及阻塞。
比如两个线程协同工作,只有在一个工作线程完成对共享资源的访问操作之后,另外一个工作线程才可以对共享资源做访问。还有比如只有当事件发生后才能让线程开始工作,需要让线程在此之间处于阻塞的状态,一旦事件发生后,唤醒等待的线程即可开始工作。