信号量

2022-02-25 08:33:01 浏览数 (3)

头文件: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()第三个参数可以控制同时访问共享资源的线程的个数,通过这个参数,可以实现同步控制、互斥、以及阻塞。

比如两个线程协同工作,只有在一个工作线程完成对共享资源的访问操作之后,另外一个工作线程才可以对共享资源做访问。还有比如只有当事件发生后才能让线程开始工作,需要让线程在此之间处于阻塞的状态,一旦事件发生后,唤醒等待的线程即可开始工作。

0 人点赞