多進程/多線程的同步


同步對象及常用API

1、 事件

事件(Event)是一個同步對象,它有兩種狀態:有信號狀態和無信號狀態。線程只有在事件有信號的時候才能獲取事件,並設置事件為無信號狀態,使得其他線程不能訪問事件所保護的數據或代碼段。線程使用完后應該將事件設置為有信號狀態,以使其他線程能夠使用。

API:

SetEvent:設置事件狀態為有信號狀態。

CreateEvent:創建一個事件對象。

ResetEvent:重設事件對象狀態為無信號狀態。

OpenEvent:通過返回一個已存在事件對象的句柄,使得進程使用同一個事件對象

PulseEvent:設置指定的事件對象為有信號的,然后重設為無信號的。它用於釋放等待線程。

WaitForSingleObject:等待一個事件。

2、  互斥量

互斥量(mutex)與臨界區非常相似,只是互斥量可在進程間使用。互斥量通過強制每個線程擁有互斥量對象使線程輪流使用資源,每次只有一個線程擁有互斥量對象。

API:

ReleaseMutex:釋放特定互斥量對象的所有權,在擁有權線程完成使用該互斥量控制的資源時使用該API。

CreateMutex:創建一個互斥量對象。

OpenMutex:通過返回一個已創建的互斥量對象的句柄在多個進程間同步。

3、  信號燈

信號量(Semaphores)被一定數量的線程用於控制對資源的訪問(與臨界區相反,臨界區只允許一個線程訪問資源或代碼段)。信號量有個資源計數器(resource counter)。每個要訪問信號量控制的資源的線程等待信號量,並將資源計數器減1。若計數器為0,則沒有資源了,並且將來要訪問資源的請求要等待。當一個線程使用完資源后,它釋放信號量,即將資源計數器加1。

API:

CreateSemaphore:創建一個信號量,並設置其資源計數器。

ReleaseSemaphore:釋放一個信號量,並將其資源計數器加1.

WaitForSingleObject:等待一個信號量(或者任何對象)。

CloseHandle:關閉句柄,並釋放資源。

 

4、  定時器

它等待某一特定時刻的到來,並通知等待線程。

5、  臨界區

它每次只允許一個線程訪問資源,如公共數據或一段代碼。與其他同步對象如互斥量相比,臨界區相對較快

API:

InitalizeCriticalSection: 在使用下面API之前初始化臨界區對象。

EnterCriticalSection: 它使調用線程等待臨界區對象,並在獲得擁有權時返回。

TryEnterCriticalSection: 與EnterCritical一樣,只是該API不會等待。

DeleteCriticalSection:它釋放臨界區對象使用的系統資源。此時臨界區對象不能被任何線程占用。

LeaveCriticalSection: 釋放對臨界區對象的擁有權。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com