在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处。
Delphi的线程同步方法: 1、临界区 申明一个临界资源 FLock : TRTLCriticalSection; 先初化一个临界资源对象 procedure TSaveThread.PushTask(pTask: pFileInfo); begin 这种方式还是挺简单的,和Java中的synchronized代码块方式类似 2、Event事件 Event有两种状态:有信号和无信号,通过这个特性可以用于线程同步。Event相关的API也多,控制起来也比较灵活,看看他的几个方法: CreateEvent:创建事件 SetEvent:设置为有信号状态 ResetEvent: 设置为无信号状态 PulseEvent :设置为有信号状态,接着又设置为无信号状态(有点类似于单步调试的感觉) 在线程中还是要用WaitForSingleObject来阻塞 procedure TSearchTopNThread.Execute; begin while not Self.Terminated do begin WaitForSingleObject(FEvent, INFINITE);//FEvent为无信号时阻塞,直到变为有信号时代码继续执行 ....... end; end; //设置事件状态为无信号,阻塞线程 procedure TForm1.Button1Click(Sender: TObject); begin ResetEvent(hEvent); end; //设置事件状态为有信号,线程解除阻塞 procedure TForm1.Button2Click(Sender: TObject); begin SetEvent(hEvent); end; //设置一次脉冲信号状态,先设置有信号,再设置无信号 procedure TForm1.Button3Click(Sender: TObject); begin PulseEvent(hEvent); end;
3、互斥对象 var hMutex: THandle; //互斥对象的句柄 function ThreadFun(p: Pointer): DWORD; stdcall; var i: Integer; beginfor i := 0 to 1000 do begin 总的过程和临界区有些类似,只不过互斥对象是系统核心对象,可以跨进程,而临界区只是当前进程。有这个特性可以用于对文件等资源的并发保护。 4、信号量 信号量与互斥对象的方法类似,信号量的特点是可以设置计数,就是同时可以允许多个线程同时访问同一段代码。互斥对象就是信号量为1的情况,后面的线程只能等前一个执行完,而信号量就可以允许指定多个执行。
后来在看TThread的代码时发现新的Delphi版本中有了一个好东西:TMnitor try TMonitor.Enter(ThreadLock); try SyncProcPtr.Queued := QueueEvent; if SyncList = nil then SyncList := TList.Create; SyncProcPtr.SyncRec := ASyncRec; SyncList.Add(SyncProcPtr); SignalSyncEvent; if Assigned(WakeMainThread) then WakeMainThread(SyncProcPtr.SyncRec.FThread); if not QueueEvent then TMonitor.Wait(SyncProcPtr.Signal, ThreadLock, INFINITE) finally TMonitor.Exit(ThreadLock); end; 这个代码和java中的Synchronized代码块很像,这样写起线程同步要简化不少。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论