【Linux】对线程同步的总结

一、前言

1、 一个进程在同一时刻能够处理多个线程,每个线程处理各自独立的任务,用线程操作能够简化异步事件。
2、程序可以通过使用线程得以简化,即使多线程程序在串行化任务时不得不阻塞, 由于某些线程在阻塞的时候还有另外一些线程可以运行。所以多线程程序在单处理器上运行仍然能够改善,响应时间和吞吐量。
3、每一个进程有一个进程ID,是唯一的进程ID用pid_t数据类型来表示。
每一个线程有一个线程ID,但线程ID只在他所属的进程环境有效线程ID用pthread_t数据类型来表示。
4、当多个线程共享相同的内存时,如果其中有多个线程可以读取并修改这个内存中的变量,那么就需要对这些线程进行同步,以确保它们在访问变量的存储内容时不会访问到无效的数值。因为当变量修改时间大于存储器访问周期时,多和写会交叉进行,就会得到不一样的数据。
5、线程A读取变量,并且给这个变量赋予一个新的值,但写操作需要两个存储器周期。当线程B在这两个存储器写。周期中读取这个相同的变量是它就会得到不一致的值。
在这里插入图片描述

6、线程B读取变量,首先要获取锁,同样,线程A更新变量时也需要获取这把同样的锁。因而线程B在线程A释放锁以前不能读取变量。
在这里插入图片描述

二、互斥量

互斥量
1、用互斥量来保护数据,确保同一时间只有一个线程访问数据
互斥量从本质上说是一把,在访问共享资源前对互斥量进行加锁加锁后任何其他视图对互斥量加锁的线程将会被阻塞直到当前线程解锁,在访问完成后解锁,如果解锁时有多个线程阻塞,则第一个线程变为可运行状态,继续加锁,每次只有一个线程执行。
2、举例说明:
它就如同一把门锁,房间就可以想象为一个临界区,在一个指定时间内,房间里只能有一个执行线程存在,当一个线程进入房间后,它会锁住身后的房门,当他结束对共享数据的操作后,它就会走出房门,打开门锁,如果另一个线程在房门上锁时来了,那么它就必须等待房间内的线程出来,并打开门锁后才能进入房间,这样线程持有锁,而锁保护了数据。

三、死锁

1、死锁产生的原因
(1)如果线程试图对同一个互斥量加锁两次,那么它自身就会陷入死锁状态。
(2)程序中使用多个互斥量时,如果允许一个线程一直占有一个互斥量,并且试图锁住第二个互斥量时处于堵塞状态,而第二个互斥量也在试图锁住第一个互斥量。
在这里插入图片描述
2、避免死锁发生的方法
(1)按顺序加锁。使用嵌套的锁时,两个线程必须保证以相同的顺序获得锁。
(2)防止发生饥饿
(3)不要重复请求同一个锁。

四、读写锁

读写锁

1、读写锁与互斥锁不同点

  • 互斥量要么是锁住状态,要么是不加锁状态,而且一次只有一个线程可以对其进行加锁。
  • 读写锁可以有三种状态,读模式下加速状态,写模式下加锁状态,不加锁状态。一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁

2、读加锁和写加锁状态

  • 当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞
  • 当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权,但是如果线程希望以写模式对此锁进行加锁,它必须阻塞直到所有线程释放读锁。
    当读写锁处于读模式锁住状态时,如果有另外的线程试图以写模式加锁,读写锁通常会阻塞随后的读模式锁请求,这样可以避免读模式锁长期占用,而等待的写模式锁请求一直得不到满足。

3、读写模式下的数据结构状态

  • 当读写锁在写模式下时,它所保护的数据结构就可以被安全的修改因为当前只有一个线程可以在写模式下拥有这个锁
  • 当读写锁在读模式下时,只要线程获取读模式下的读写锁,该锁所保护的数据结构可以被多个获得读模式锁的线程读取

4、总结

当读写锁以读模式锁住时,它是以共享模式锁住的,当它以写模式锁住时,它是以独占模式锁住的。

五、条件变量

详讲条件变量
1、条件变量与互斥量一同使用允许线程以无竞争的方式等待特定的条件发生
2、条件本身是由互斥量保护的,线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变。因为必须锁定互斥量以后才能计算条件。
3、举例
如果你想要进一个教室学习,假设你很热爱自习,所以每次你都去的最早,所以当其他同学来的时候就要排队等待,这些等待的同学每隔几分钟就去看一次你是否离开,但是你因为热爱自习所以经常自习很久,这些等待的同学有时候会浪费一整天时间来看你是否自习结束。因此自习室后来又加入了通知的机制,当自习室没有人时就会通知其他人,这样使同学们的效率大大提高。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值