云呼叫中心系统搭建的关键步骤与最佳实践探讨
974
2022-05-29
1. 信号量介绍
信号量的运用环境与互斥锁一样,但是信号量比互斥锁增加灵活,互斥锁只有两个状态(开锁和解锁),而信号量本质上是一个计数器,它内部有一个变量计数信号值,可以保护一个资源可以同时被1个或者2个或者3个线程同时使用,如果信号量的值只是设置1(状态只有0和1),那么和互斥锁就是一样的功能。
总结
信号量也主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个线程或者多个线程独享。
信号量是一种特殊的变量,访问具有原子性, 用于解决进程或线程间共享资源引发的同步问题。
信号量就是一个计数变量,内部本身就是一个变量。只不过这个变量具有原子性。
信号量经常用来保护临界区资源、实现资源同步。
如果信号量只有2个值,0和1,就称为二值信号量==互斥锁。
**信号量和互斥锁(mutex)的区别:**互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区,要使用信号量同步,需要包含头文件semaphore.h。
2. 信号量实现接口函数
2.1 初始化信号量
#include
sem_init是创建信号量的 API,其中 value 为信号量的初值,pshared 表示是否为多进程共享而不仅仅是用于一个进程之间的多线程共享。
如果pshared的值为0,那么信号量在进程的线程之间共享,并且应位于所有线程可见的某个地址(例如,全局变量)能够,或在堆上动态分配的变量),如果pshared不为零,那么信号量在进程之间共享,信号量的值就位于共享内存区域。
2.2 注销信号量
int sem_destroy(sem_t * sem);
注销信号量时,必须保证被注销的信号量 sem没有线程在等待该信号量,否则会返回-1,且置 errno 为 EBUSY。正常返回0。
2.3 释放信号量
int sem_post(sem_t * sem); //相当于解锁
释放信号量操作将信号量值原子地加 1,表示增加一个可访问的资源。只有信号量值大于 0,才能访问公共资源。主要用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞。
2.4 等待信号量
int sem_wait(sem_t * sem); //相当于加锁 int sem_trywait(sem_t * sem); //不阻塞
sem_wait()用于阻塞等待信号量(获取信号量),主要被用来阻塞当前线程直到信号量 sem 的值大于 0,得到信号量之后,信号量的值会减一。
2.5 获取当前的信号量值
int sem_getvalue(sem_t * sem, int * sval);
读取sem中的信号量计数,存于*sval 中,并返回 0。
3. 案例代码: 信号量框架运用模型
#include
linux 任务调度
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。