linux系统编程 信号量

本文介绍了信号量的概念及其在多线程编程中的应用。信号量作为一种更细粒度的同步机制,能够有效提升线程间的并发性,避免了互斥锁带来的串行执行问题。文章详细解释了信号量的初始化、加锁、解锁等操作,并提供了具体的示例代码。

信号量是进化版的互斥锁:由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一个对象的一部分数据进行共享,使用互斥锁是没有办法实现的,只能对整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降,线程从并发执行,变成了串行执行。与直接使用单进程无异。

信号量,是相对折中的一种处理方式,既能保证同步,数据不混乱,又能提高线程并发。

  1 /*
  2 头文件:#include <semaphore.h>
  3 
  4 初始化信号量:
  5 int sem_init(sem_t *sem, int pshared, unsigned int value);
  6 eg:sem_init(&(定义的全局信号量),0,5);//初始化信号量为5
  7 
  8 销毁一个信号量:
  9 int sem_destroy(sem_t *sem);
 10 eg:sem_destroy(&(定义的全局信号量));//销毁该信号量
 11 
 12 给信号量加锁:
 13 int sem_wait(sem_t *sem);
 14 eg:sem_wait(&(定义的全局信号量));//将信号量--,为0时则阻塞等待
 15 
 16 尝试对信号量加锁
 17 int sem_trywait(sem_t *sem);
 18 
 19 限时对信号量加锁
 20 int sem_timedwait(sem_t *restrict sem,const struct timespec *restrict abs_timeout);
 21  
 22 给信号量解锁:
 23 int sem_post(sem_t *sem);
 24 eg: sem_post(&(定义的全局信号量));//将信号量++,同时唤醒阻塞在信号量的线程
 25 
 26 返回值:成功返回0;失败返回-1
 27 sem_t sem:声明信号量,sem不能<0
 28 pshared:取0值代表用于线程间,取非0(一般为1)代表用于进程间
 29 value:指定信号量的初始值
 30 
 31 作用:通过操作信号量的值,限制进程或线程的动作(类似互斥锁)
 32 */

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值