线程同步

线程同步的方式:1.互斥锁(Mutex),    2.条件变量(condition variable),       3.信号量(Semaphore) 。

一、互斥锁

互斥锁的理解相对比较简单,就是每个线程对资源互斥访问时,必须加上互斥锁的保护。

更深一层:为了减少线程被阻塞的机会,有的os提供了一种对于mutext的另一个中操作---Trylock,用Trylock去检测mutex的状态,如果是lock状态,返回失败,否则返回成功。


二、条件变量

条件变量的诞生背景:当线程A去访问临界资源1时,还需要访问另一个临界资源2。同时另一个线程B去访问临界资源2时,还需要访问临界资源1。这种场景下会概率性的产生死锁现象。 死锁时的调度顺序请读者自行理解,这里不再赘述。

为了解决这个死锁问题,进而引入了条件变量。

所以条件变量的使用通常都是和互斥锁配套使用的。创建一个互斥锁时便联系着一个条件变量。单纯的互斥锁用于短期的锁定,保证各个线程互斥的进入临界资源。

条件变量则用于线程的长期等待,直至所有资源都可用。

核心接口:

①等待条件成立.pthread_wait(condition,mutext),在wait的同时接口内部会同时unlock对应的Mutex

②激活条件变量:pthread_cond_signal(condition),pthread_cond_broadcast(激活所有等待线程)

更深一层:如果条件变量释放的是一个临界资源,则此时唤醒此条件变量上等待的某一线程。

如果条件变量释放的是一个数据文件,则当一个写线程完成写操作后,需要唤醒其他的读线程。


三、信号量

信号量分为私用信号量和共用信号量。当信号量的资源为1时,实际就是Mutex了。

一般我们代码用的都是私用信号量,工程师自己负责创建,调用和释放。

公用信号量:由OS为它分配存储空间,工程师如果自己忘记释放,OS会负责释放








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值