Loading AI tools
来自维基百科,自由的百科全书
在同步的程式設計中,臨界區段(Critical section)或稱為關鍵區段 ,指的是一個存取共用資源(例如:共用裝置或是共用記憶體)的程式片段,而這些共用資源又無法同時被多個執行緒存取的特性。[1]
此條目需要補充更多來源。 (2018年3月13日) |
當有執行緒進入臨界區段時,其他執行緒或是行程必須等待(例如:bounded waiting 等待法),有一些同步的機制必須在臨界區段的進入點與離開點實現,以確保這些共用資源是被互斥或的使用,例如:semaphore。
只能被單一執行緒存取的裝置,例如:印表機。
一個最簡單的實現方法就是當執行緒(Thread)進入臨界區段時,禁止改變處理器;在Single-Processor系統上,可以用「禁止中斷(CLI)」來完成,避免發生系統調用(System Call)導致的上下文交換(Context switching);當離開臨界區段時,處理器回復原先的狀態。
在Windows操作系統,CRITICAL_SECTION是一種同步對象類型,用於同一個進程內的多線程同步訪問資源。如果是跨進程同步,需要使用互斥鎖(mutex)。
臨界區對象首先需要初始化,通過調用操作系統API函數InitializeCriticalSection。各個線程調用函數 EnterCriticalSection, TryEnterCriticalSection, 或LeaveCriticalSection來使用臨界區。使用結束後或者重初始化臨界區之前,需要調用 DeleteCriticalSection 。
WINNT.H中定義的臨界區數據結構如下:
struct RTL_CRITICAL_SECTION
{
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
ULONG_PTR SpinCount;
};
結構的各域的解釋:
RTL_CRITICAL_SECTION_DEBUG結構如下:
struct _RTL_CRITICAL_SECTION_DEBUG
{
WORD Type;
WORD CreatorBackTraceIndex;
RTL_CRITICAL_SECTION *CriticalSection;
LIST_ENTRY ProcessLocksList;
DWORD EntryCount;
DWORD ContentionCount;
DWORD Spare[ 2 ];
}
結構的各域的解釋:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.