"臨界區"(CriticalSection):?當把壹段代碼放入壹個臨界區,?線程執行到臨界區時就獨占了,?讓其他也要執行此代碼的線程先等等;
使用格式如下:
var?CS:?TRTLCriticalSection;?{聲明壹個?TRTLCriticalSection?結構類型變量;?它應該是全局的}?
InitializeCriticalSection(CS);?{初始化}?
EnterCriticalSection(CS);{開始:?輪到我了其他線程走開}?
LeaveCriticalSection(CS);{結束:?其他線程可以來了}?
DeleteCriticalSection(CS);?{刪除:?註意不能過早刪除}?
多線程同步示例
1?unit?Unit1;? 2 3?interface? 4 5?uses? 6?Windows,?Messages,?SysUtils,?Variants,?Classes,?Graphics,?Controls,?Forms,? 7?Dialogs,?StdCtrls;? 8 9?type?10?TForm1?=?class(TForm)?
11?ListBox1:?TListBox;?
12?Button1:?TButton;?
13?procedure?FormCreate(Sender:?TObject);?
14?procedure?FormDestroy(Sender:?TObject);?
15?procedure?Button1Click(Sender:?TObject);?
16?end;?
17
18?var?
19?Form1:?TForm1;?
20
21?implementation?
22
23?{$R?*.dfm}?
24
25?var?
26?CS:?TRTLCriticalSection;?
27
28?function?MyThreadFun(p:?Pointer):?DWORD;?stdcall;?
29?var?
30?i:?Integer;?
31?begin?
32?EnterCriticalSection(CS);?
33?for?i?:=?0?to?99?do?Form1.ListBox1.Items.Add(IntToStr(i));?
34?LeaveCriticalSection(CS);?
35?Result?:=?0;?
36?end;?
37
38?procedure?TForm1.Button1Click(Sender:?TObject);?
39?var?
40?ID:?DWORD;?
41?begin?
42?CreateThread(nil,?0,?@MyThreadFun,?nil,?0,?ID);?
43?CreateThread(nil,?0,?@MyThreadFun,?nil,?0,?ID);?
44?CreateThread(nil,?0,?@MyThreadFun,?nil,?0,?ID);?
45?end;?
46
47?procedure?TForm1.FormCreate(Sender:?TObject);?
48?begin?
49?ListBox1.Align?:=?alLeft;?
50?InitializeCriticalSection(CS);?
51?end;?
52
53?procedure?TForm1.FormDestroy(Sender:?TObject);?
54?begin?
55?DeleteCriticalSection(CS);?
56?end;?
57
58?end.