线程同步方法-信号量

可以理解为进化版的互斥锁(1->N)
由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住,这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发行降低。线程并行执行,变成了串行执行,与直接使用单进程没有区别,信号量是相对折中的一种做法,既能保证同步,数据不混乱,又能提高线程并发;(注意:进程同步也可以使用信号量)
信号量主要函数:
sem_init(信号量初始化函数)
sem_destroy函数
sem_wait函数
sem_trywait函数
sem_timedwait函数
sem_post函数
以上6个函数返回值是:成功返回0,失败返回-1;同时设置error(注意他们没有pthread前缀)
sem_t类型,本指仍是结构体。但应用期间可以简单的看作整数,忽略实现细节(类似于使用文件描述符)
sem_t sem;规定sem 不能<0;头文件是<semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem_t sem
int pshared //0表示在线程间共享;
unsigned int value//表示信号量的初始化值;
sem_wait:1信号量大于0,则信号量–(pthread_mutex_lock)
2.信号量等于0,此时会造成线程阻塞
sem_post:将信号量++,同时唤醒阻塞在信号量上的线程(类比pthread_mutex_unlock)
但由于 sem_t的实现对用户隐藏,所以所谓的++,–操作只能通过函数实现,不能直接进行++,–符号;信号量的初值,决定了占用信号量的线程的个数;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值