Delphi多线程编程之三同步读写全局数据

开始研究最重要的多线程读写全局数据了,结合书上的例子,我修改成下面的情况:

  1. unit Tst_Thread3U;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;
  5. type
  6.   TForm1 = class(TForm)
  7.     Button1: TButton;
  8.     Memo1: TMemo;
  9.     Button2: TButton;
  10.     Button3: TButton;
  11. procedure Button1Click(Sender: TObject);
  12. procedure Button2Click(Sender: TObject);
  13. procedure Button3Click(Sender: TObject);
  14. private
  15. procedure ThreadsDone(Sender: TObject);
  16. end;
  17.   TMyThread=class(TThread)
  18. protected
  19. procedure Execute;override;
  20. end;
  21. var
  22.   Form1: TForm1;
  23. implementation
  24. {$R *.dfm}
  25. const
  26.   MaxSize=128;
  27. var
  28.   NextNumber:Integer=0;
  29.   DoneFlags:Integer=0;
  30.   GlobalArry:array[1..MaxSize] of Integer;
  31.   Lock:byte;   //1-不同步  2-临界区 3-互斥
  32.   CS:TRTLCriticalSection; //临界区
  33.   hMutex:THandle;  //互斥
  34. function GetNextNumber:Integer;
  35. begin
  36.   Result:=NextNumber;
  37.   inc(NextNumber);
  38. end;
  39. procedure TMyThread.Execute;
  40. var
  41.   i:Integer;
  42. begin
  43.   FreeOnTerminate:=True; //终止后自动free
  44.   OnTerminate:=Form1.ThreadsDone;
  45. if Lock<>3 then //非互斥情况
  46. begin
  47. if Lock=2 then EnterCriticalSection(CS); //建立临界区
  48. for i := 1 to MaxSize do
  49. begin
  50.       GlobalArry[i]:=GetNextNumber;
  51.       Sleep(5);
  52. end;
  53. if Lock=2 then LeaveCriticalSection(CS);//离开临界区
  54. end else //-------互斥
  55. begin
  56. if WaitForSingleObject(hMutex,INFINITE)=WAIT_OBJECT_0 then
  57. begin
  58. for i := 1 to MaxSize do
  59. begin
  60.         GlobalArry[i]:=GetNextNumber;
  61.         Sleep(5);
  62. end;
  63. end;
  64.     ReleaseMutex(hMutex);   //释放
  65. end;
  66. end;
  67. procedure TForm1.ThreadsDone(Sender: TObject);
  68. var
  69.   i:Integer;
  70. begin
  71.   Inc(DoneFlags);
  72. if DoneFlags=2 then
  73. begin
  74. for i := 1 to MaxSize do
  75.       Memo1.Lines.Add(inttostr(GlobalArry[i]));
  76. if Lock=2 then DeleteCriticalSection(CS); //删除临界区
  77.        If Lock=3 then CloseHandle(hMutex); //关闭互斥
  78. end;
  79. end;
  80. //非同步
  81. procedure TForm1.Button1Click(Sender: TObject);
  82. begin
  83.   Lock:=1;
  84.   TMyThread.Create(False);
  85.   TMyThread.Create(False);
  86. end;
  87. //临界区
  88. procedure TForm1.Button2Click(Sender: TObject);
  89. begin
  90.   Lock:=2; 
  91.   InitializeCriticalSection(CS); //初始化临界区
  92.   TMyThread.Create(False);
  93.   TMyThread.Create(False);
  94. end;
  95. //互斥
  96. procedure TForm1.Button3Click(Sender: TObject);
  97. begin
  98.   Lock:=3; // 互斥
  99.   hMutex:=CreateMutex(0,False,nil);
  100.   TMyThread.Create(False);
  101.   TMyThread.Create(False);
  102. end;
  103. end.

没有临界区和互斥的帮助,两个线程都不断地在Memo1输出,而且数字是乱的。

posted @ 2011-10-05 13:40  星星的学习小志  阅读(542)  评论(0编辑  收藏  举报