多线程同步机制的几种方法

Critical Section
Critical section(临界区)用来实现“排他性占有”。适用范围是单一进程
的各线程之间。它是:
 一个局部性对象,不是一个核心对象。
 快速而有效率。
 不可以同时有一个以上的 critical section 被等待。
 没法侦测是否已被某个线程放弃。app

能够实现线程间互斥,不能用来实现同步。函数

 

Semaphore
Semaphore 被用来追踪有限的资源。它是:
一个核心对象。操作系统

 没有拥有者。线程

 能够具名,所以能够被其余进程开启。
 能够被任何一个线程释放(released)。设计

既能实现线程间互斥,也能实现线程间同步。对象

在跨进程中使用时,若是拥有信号量的线程意外结束,其它进程不会收到通知。进程

 

Mutex
Mutex 是一个核心对象,能够在不一样的线程之间实现“排他性占有”,甚
至即便那些线程分属不一样进程。它是:
一个核心对象。
 若是拥有 mutex 的那个线程结束,则会产生一个 “abandoned” 错
误信息。
i能够具名,所以能够被其余进程开启。
只能被拥有它的那个线程释放(released)。事件

在跨进程中使用时,若是拥有互斥器的进程意外结束,其它进程会收到一个WAIT_ABANDOEND消息。资源


Event 
Event object 一般使用于 overlapped I/O,或用来设计某些自定
义的同步对象。它是:
 一个核心对象。
但是用来实现线程的互斥与同步。
能够具名,所以能够被其余进程开启。同步

在跨进程中使用时,若是拥有信号量的线程意外结束,其它进程也不会受到通知。

 

 

注意:临界区和互斥器都有“线程全部权”的概念,因此它们是不能用来实现线程间的同步的,只能用来实现互斥。缘由是因为建立临界区或互斥器的线程能够不用等待LeaveCriticalSection(),SetEvent()就能够无条件进入保护的程序段,由于它拥有这个权利。另外,互斥器能够很好的处理”遗弃“操做。若线程在未释放对向象的时候就意外终止的,其它线程能够等待到一个WAIT_ABANDONED_0。可是事件和信号量都不能作到。

事件和信号量均可以实现线程和进程间的互斥和同步。

就使用效率来讲,临界区的效率是最高的,由于它不是内核对象,而其它的三个都是核心对象,要借助操做系统来实现,效率相对来讲就比较低。

但若是要跨进程使用仍是要用到互斥器、事件对象和信号量。

总之:在设计时,首先尽可能不要使用全局变量,若是不得以先而后考虑使用Inter...()函数,而后在是临界区对象,最后才是事件、互斥器、信号量。

相关文章
相关标签/搜索