Delphi多线程编程之三同步读写全局数据
开始研究最重要的多线程读写全局数据了,结合书上的例子,我修改成下面的情况:
- unit Tst_Thread3U;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;
- type
- TForm1 = class(TForm)
- Button1: TButton;
- Memo1: TMemo;
- Button2: TButton;
- Button3: TButton;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- procedure Button3Click(Sender: TObject);
- private
- procedure ThreadsDone(Sender: TObject);
- end;
- TMyThread=class(TThread)
- protected
- procedure Execute;override;
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- const
- MaxSize=128;
- var
- NextNumber:Integer=0;
- DoneFlags:Integer=0;
- GlobalArry:array[1..MaxSize] of Integer;
- Lock:byte; //1-不同步 2-临界区 3-互斥
- CS:TRTLCriticalSection; //临界区
- hMutex:THandle; //互斥
- function GetNextNumber:Integer;
- begin
- Result:=NextNumber;
- inc(NextNumber);
- end;
- procedure TMyThread.Execute;
- var
- i:Integer;
- begin
- FreeOnTerminate:=True; //终止后自动free
- OnTerminate:=Form1.ThreadsDone;
- if Lock<>3 then //非互斥情况
- begin
- if Lock=2 then EnterCriticalSection(CS); //建立临界区
- for i := 1 to MaxSize do
- begin
- GlobalArry[i]:=GetNextNumber;
- Sleep(5);
- end;
- if Lock=2 then LeaveCriticalSection(CS);//离开临界区
- end else //-------互斥
- begin
- if WaitForSingleObject(hMutex,INFINITE)=WAIT_OBJECT_0 then
- begin
- for i := 1 to MaxSize do
- begin
- GlobalArry[i]:=GetNextNumber;
- Sleep(5);
- end;
- end;
- ReleaseMutex(hMutex); //释放
- end;
- end;
- procedure TForm1.ThreadsDone(Sender: TObject);
- var
- i:Integer;
- begin
- Inc(DoneFlags);
- if DoneFlags=2 then
- begin
- for i := 1 to MaxSize do
- Memo1.Lines.Add(inttostr(GlobalArry[i]));
- if Lock=2 then DeleteCriticalSection(CS); //删除临界区
- If Lock=3 then CloseHandle(hMutex); //关闭互斥
- end;
- end;
- //非同步
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- Lock:=1;
- TMyThread.Create(False);
- TMyThread.Create(False);
- end;
- //临界区
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- Lock:=2;
- InitializeCriticalSection(CS); //初始化临界区
- TMyThread.Create(False);
- TMyThread.Create(False);
- end;
- //互斥
- procedure TForm1.Button3Click(Sender: TObject);
- begin
- Lock:=3; // 互斥
- hMutex:=CreateMutex(0,False,nil);
- TMyThread.Create(False);
- TMyThread.Create(False);
- end;
- end.
没有临界区和互斥的帮助,两个线程都不断地在Memo1输出,而且数字是乱的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库