其他分享
首页 > 其他分享> > 操作系统基础(四)线程同步方式

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

作者:互联网

一、互斥和同步

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

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

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

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

二、线程同步的4种方式

2.1 临界区(CriticalSection)

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

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

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

2.2 互斥量(Mutex)

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

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

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

2.3 事件(Event)

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

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

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

2.4 信号量(Semphore)

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

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

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

标签:同步,操作系统,对象,互斥,临界,线程,事件,资源
来源: https://blog.csdn.net/JinYJ2014/article/details/122788236