6.27.2007

Win32 的同步物件 - 一些

Citical Section

Critical Section 可以重複進入 ( 正確的說,是對已經進入Critical Section 的Thread而言..),但是進入的次數和退出的次數必須要一樣,才可以正確離開critical section。


和Critcal Sectin 類似的mutex 元件,使用上要比Critical Section 花比較多的時間(約100倍)。因為critical section 可以在user space中完成,mutex卻一定要進入kernel space。

所以 Critical Section 只能用在同一個process中,各thread之間的同步。無法做到 process間的同步。

mutex就可以用在 process間。

... 所以 criticalsection 沒有 "name",mutex可以有name (在create時指定)。

Semaphore

Semaphore 是counting semaphore,在 CreateSemaphore( )時就要指定 maximum counting number。


Event

Event 有AutoReset和ManualReset 兩種 (CreateEvent( )時指定)。ResetEvent( )把Event 設定為un-triggered。 SetEvent( )和 PulseEvent( )都可以把Event設定為Trigger。
PulseEvent( )是特殊的:
  • Event是AutoReset : PulseEvent( )只會Wakeup 一個Waiting Event的Thread。然後恢復un-trigger。
  • Event是ManualReset : PulseEvent( )會Wakeup 所有Waiting Event的Thread,然後恢復un-trigger。

HANDLE WINAPI CreateEvent(
__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
__in BOOL bManualReset,
__in BOOL bInitialState,
__in_opt LPCTSTR lpName
);


InterlockedXXX


這是用在multi-tasking 系統中常用的 if(xx > 0) xx--; 的問題,避免在if( )後被task switch 掉,導致 回來執行時,xx已經改變。所以提供一個atomic lock++, lock-- 的function。
如其名所示,InterlockXX 只能作相對於0的判斷。
  • int InterlockedIncrement( *count ) : 將count++,如果 > 0,return 1,等於0 return 0,小於0 return 負值
  • int InterlockedDecrement( *count) : 將count--....
還有另一個類似的funciton ,是作 .. oldvar = var; var=newvalue 時,位了避免在中間被task switch 掉。
  • int InterlockedExchange( *var, newvalue) : return oldvar回來。

其他,就是上次提到的... Thread 本身也是一個同步物件。

沒有留言: