操作系统基础(四)线程同步方式

一、互斥和同步

  互斥,对于共享的系统资源,在各个线程访问时的排它性。任何时刻最多只允许一个线程去使用,其他要使用的线程必须等待,直到占用资源者释放该资源。

  同步,协同步调,按预定的先后次序进行。同步也满足互斥的条件,并且多了执行顺序的要求。

  临界区(Critical Section)、互斥对象(Mutex)主要用于互斥控制;都具有拥有权的控制方法,只有拥有该对象的线程才能执行任务,所以拥有,执行完任务后一定要释放该对象。

  信号量(Semaphore)、事件对象(Event):事件对象是以通知的方式进行控制,主要用于同步控制

二、线程同步的4种方式

2.1 临界区(CriticalSection)

  临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。

  它并不是核心对象,不属于操作系统维护的,只能同一进程中线程使用,不能跨进程使用。

  临界区一般使用锁的方式来实现,常见的互斥锁和读写锁:提供对临界资源的保护,当多线程试图访问临界资源时,都必须通过获取锁的方式来访问临界资源。(临界资源:是被多线程共享的资源)当读写线程获取锁的频率差别不大时,一般采用互斥锁,如果读线程访问临界资源的频率大于写线程,这个时候采用读写锁较为合适。

2.2 互斥量(Mutex)

  互斥量多用于多进程之间的线程互斥,用来确保一个线程独占一个资源的访问。而且能正确处理资源遗弃的问题。

“遗弃”问题就是——占有某种资源的进程意外终止后,其它等待该资源的进程能否感知。而事件与信号量都无法处理遗弃问题。

  互斥对象和临界区对象非常相似,只是互斥对象允许在进程间使用,而临界区只限制与同一进程的各个线程之间使用,但是更节省资源,更有效率。

2.3 事件(Event)

  事件机制,则允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。

  事件是内核对象,事件分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。

  事件可以解决线程间同步问题,因此也能解决互斥问题。

2.4 信号量(Semphore)

  当需要一个计数器来限制可以使用某共享资源的线程数目时,可以使用“信号量”对象。

  信号量提供对临界资源的安全分配。如果存在多份临界资源,在多个线程争抢临界资源的情况下,向线程提供安全分配临界资源的方法。

  如果临界资源的数量为1,将退化为锁。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值