在接下来多线程的课题中要使用一些内核对象, 不如先盘点一下, 到时碰到这个属性时给个 nil 即可, 不必再费神.
{建立事件} function CreateEvent( lpEventAttributes: PSecurityAttributes; {!} bManualReset: BOOL; bInitialState: BOOL; lpName: PWideChar ): THandle; stdcall; {建立互斥} function CreateMutex( lpMutexAttributes: PSecurityAttributes; {!} bInitialOwner: BOOL; lpName: PWideChar ): THandle; stdcall; {建立信号} function CreateSemaphore( lpSemaphoreAttributes: PSecurityAttributes; {!} lInitialCount: Longint; lMaximumCount: Longint; lpName: PWideChar ): THandle; stdcall; {建立等待计时器} function CreateWaitableTimer( lpTimerAttributes: PSecurityAttributes; {!} bManualReset: BOOL; lpTimerName: PWideChar ): THandle; stdcall;
上面的四个系统内核对象(事件、互斥、信号、计时器)都是线程同步的手段, 从这也能看出处理线程同步的复杂性; 不过这还不是全部, Windows Vista 开始又增加了 Condition variables(条件变量)、Slim Reader-Writer Locks(读写锁)等同步手段.
不过最简单、最轻便(速度最快)的同步手段还是 CriticalSection(临界区), 但它不属于系统内核对象, 当然也就没有句柄、没有 TSecurityAttributes 这个安全属性, 这也导致它不能跨进程使用; 不过写多线程时一般不用跨进程, 所以 CriticalSection 应该是最常用的同步手段.
二、临界区。delphi多线程
先看一段程序, 代码文件:
unit Unit1; intece uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} function MyThreadFun(p: Pointer): DWORD; stdcall; var i: Integer; begin for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i)); Result := 0; end; procedure TForm1.Button1Click(Sender: TObject); var ID: DWORD; begin CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); end; procedure TForm1.FormCreate(Sender: TObject); begin ListBox1.Align := alLeft; end; end.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-25504-12.html
#吴亦凡1106生日快乐##吴亦凡##吴亦凡BadGirl#吴亦凡新歌首唱BadGirl
棒棒哒