"臨界區"(CriticalSection): 當把一段代碼放入一個臨界區, 線程執行到臨界區時就獨佔了, 讓其他也要執行此代碼的線程先等等; 這和前面用的 Lock 和 UnLock 差不多; 使用格式如下:
var CS: TRTLCriticalSection; {聲明一個 TRTLCriticalSection 結構類型變數; 它應該是全域的}InitializeCriticalSection(CS); {初始化}EnterCriticalSection(CS); {開始: 輪到我了其他線程走開}LeaveCriticalSection(CS); {結束: 其他線程可以來了}DeleteCriticalSection(CS); {刪除: 注意不能過早刪除}//也可用 TryEnterCriticalSection 替代 EnterCriticalSection.var CS: TRTLCriticalSection;function MyThreadFun(p: Pointer): DWORD; stdcall;var i: Integer;begin EnterCriticalSection(CS); for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i)); LeaveCriticalSection(CS); Result := 0;end;procedure TForm1.Button1Click(Sender: TObject);var ID: DWORD;begin CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);end;procedure TForm1.FormCreate(Sender: TObject);begin ListBox1.Align := alLeft; InitializeCriticalSection(CS);end;procedure TForm1.FormDestroy(Sender: TObject);begin DeleteCriticalSection(CS);end;Delphi 在 SyncObjs 單元給封裝了一個 TCriticalSection 類, 用法差不多
uses SyncObjs;var CS: TCriticalSection;function MyThreadFun(p: Pointer): DWORD; stdcall;var i: Integer;begin CS.Enter; for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i)); CS.Leave; Result := 0;end;procedure TForm1.Button1Click(Sender: TObject);var ID: DWORD;begin CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);end;procedure TForm1.FormCreate(Sender: TObject);begin ListBox1.Align := alLeft; CS := TCriticalSection.Create;end;procedure TForm1.FormDestroy(Sender: TObject);begin CS.Free;end;