锁与信号量,同步与互斥

互斥:一个厕所坑位只能一次蹲一个人,其他人只能在门外,已经占有的人对其他人来说就是互斥。
同步:流水线上,一个人给手机按了电池,放在流水线上,另一个人拿来盖上盖子,后面一个人再拧上螺丝,这几个人的工作就是同步的。
互斥和同步在操作系统的概念中的被称为锁和信号量。其中信号量发送和接收不一定要在一个线程中。
读写锁:读的时候大家都可以一起读,写得时候只能一个人写,就比如隔着玻璃罩的商品,大家都可以看,但是如果要更换玻璃罩里的东西,就把门关了,一个人换,换好了打开门大家又都可以看了。
自旋锁:一个资源被其他人占用了,那么我只能在这里等待,就像在门外等着上厕所的人,等的原地打转,所以叫自旋锁。
可重入锁:这个线程被我锁住,那么我可以多次进入这个锁,但被人不可以进入。

线程同步:使用互斥锁进行线程同步,当一个资源被两个线程访问时,可以把这个两个线程访问这个资源的代码段放入临界区,也就是用互斥锁锁住,这样当一个线程在访问时,另一个到达临界区就会被阻塞住,直到前一个线程出临界区解锁后,阻塞状态就会被激活,继续执行。这样将线程串行访问临界区的操作叫做线程同步。
死锁:在多线程访问临界区资源时,临界区资源被互斥或者其他同步锁锁住,如果一个线程进去临界区,出来的时候没有解锁,这样下次它自己进不去自己的临界区,别的线程进去自己的临界区访问这个资源时也进不去,所有访问这个资源的线程都别阻塞在自己的临界区之外,这就是线程死锁。

读写锁是互斥锁的升级,在linux系统接口中(#include<pthread.h>)它的类是pthread_rwlock_t,互斥锁是pthread_mutex_t。读写锁有以下三个特点:
1.当多个线程同时读被锁锁住的资源时,他们是并行的。
2.当多个线程同时写被读写锁锁住的资源时,他们是串行的。
2.当n个线程同时访问被读写锁锁住的资源,另外同时也有m个线程要读这个资源时,写的线程优先,n个线程写的顺序随机,当n个线程串行写好后,m个线程才一起去读,读是并行的。
如果资源只是写,读写锁和互斥锁区别不大,如果还需要大量的读,推荐用读写锁。
读写锁使用有四个步骤,初始化,加锁,解锁,销毁。其中用函数给pthread_rwlock_t的对象加锁分为加读锁函数和加写锁函数两种。
如果被写锁函数锁定了,那么执行读锁函数时就会阻塞。
如果被读锁函数锁定,那么再执行读锁函数时就不会被阻塞。
不管锁定了读操作还是写操作,当执行写锁函数时都会被阻塞。

条件变量的使用场景:互斥锁和写锁可以实现线程同步,但条件变量不可以,那么为什么使用了锁还要使用条件变量呢,让情况变得复杂,这是因为条件变量主要是处理生产者和消费者的情况。生产消费模型需要条件变量配合着锁一起搭建,其中锁的作用就是同步。linux系统接口中信号量和锁同一个头文件(#include<pthread.h>)
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);//此时会先解锁,然后阻塞,当接收到信号量不再阻塞后,会再把锁加上。

推荐一套音视频免费课程,笔者听完了,nice!免费报名可听!
免费音视频课程连接,点击此处

参考:丙哥

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

、、、、南山小雨、、、、

分享对你有帮助,打赏一下吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值