zoukankan      html  css  js  c++  java
  • 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输出,而且数字是乱的。

  • 相关阅读:
    Ansible import_playbook 导入playbook
    Ansible Playbook 变量传递
    Ansible Notify与Handler组合
    Ansible Role
    Ansible infile模块
    Ansible When有条件的运行任务
    Ansible register捕获命令输出
    Ansible Command Shell Raw模块区别
    Ansible Facts
    Ansible Jinjia2模块
  • 原文地址:https://www.cnblogs.com/94YY/p/2199344.html
Copyright © 2011-2022 走看看