資源描述:
《[delphi]多線程編程(10)(11)多線程同步之 mutex (互斥對象)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、原理分析:互斥對象是系統(tǒng)內(nèi)核對象,各線程都可以擁有它,誰擁有誰就能執(zhí)行;執(zhí)行完畢,用ReleaseMutex函數(shù)釋放擁有權(quán),以讓其他等待的線程使用.其他線程可用WaitForSingleObject函數(shù)排隊(duì)等候(等候也可以理解為排隊(duì)申請).使用過程:varhMutex:THandle;{應(yīng)該先聲明一個(gè)全局的互斥句柄}CreateMutex{建立一個(gè)互斥對象}WaitForSingleObject{用等待函數(shù)排隊(duì)等候}ReleaseMutex{釋放擁有權(quán)}CloseHandle{最后釋放互斥對象}ReleaseMutex、CloseHandle的
2、參數(shù)都是CreateMutex返回的句柄,關(guān)鍵是CreateMutex函數(shù):functionCreateMutex(lpMutexAttributes:PSecurityAttributes;bInitialOwner:BOOL;{是否讓創(chuàng)建者(此例中是主線程)擁有該互斥對象}lpName:PWideChar{可以給此互斥對象取個(gè)名字,如果不要名字可賦值為nil}):THandle;{1、第一個(gè)參數(shù)前面說過.2、第二個(gè)參數(shù)在這里一定要是False,如果讓主線程擁有互斥,從理論上講,得等程序退出后其他線程才有機(jī)會(huì);取值False時(shí),第一個(gè)執(zhí)行的線
3、程將會(huì)最先擁有互斥對象,一旦擁有其他線程就得先等等.3、第三個(gè)參數(shù),如果給個(gè)名字,函數(shù)將從系統(tǒng)中尋找是否有重名的互斥對象,如果有則返回同名對象的存在的句柄;如果賦值為nil將直接創(chuàng)建一個(gè)新的互斥對象;下個(gè)例子將會(huì)有名字.}本例效果圖:代碼文件:unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;typeTForm1=class(TForm)Button1:TButton;procedu
4、reButton1Click(Sender:TObject);procedureFormCreate(Sender:TObject);procedureFormDestroy(Sender:TObject);end;varForm1:TForm1;implementation{$R*.dfm}varf:Integer;{用這個(gè)變量協(xié)調(diào)一下各線程輸出的位置}hMutex:THandle;{互斥對象的句柄}functionMyThreadFun(p:Pointer):DWORD;stdcall;vari,y:Integer;beginInc(f);
5、y:=20*f;fori:=0to50000dobeginifWaitForSingleObject(hMutex,INFINITE)=WAIT_OBJECT_0thenbeginForm1.Canvas.Lock;Form1.Canvas.TextOut(20,y,IntToStr(i));Form1.Canvas.Unlock;Sleep(0);{稍稍耽擱一點(diǎn),不然有時(shí)Canvas會(huì)協(xié)調(diào)不過來}ReleaseMutex(hMutex);end;end;Result:=0;end;procedureTForm1.Button1Click(Se
6、nder:TObject);varThreadID:DWORD;beginRepaint;f:=0;CreateThread(nil,0,@MyThreadFun,nil,0,ThreadID);CreateThread(nil,0,@MyThreadFun,nil,0,ThreadID);CreateThread(nil,0,@MyThreadFun,nil,0,ThreadID);CreateThread(nil,0,@MyThreadFun,nil,0,ThreadID);CreateThread(nil,0,@MyThreadFun,n
7、il,0,ThreadID);end;procedureTForm1.FormCreate(Sender:TObject);beginhMutex:=CreateMutex(nil,False,nil);end;procedureTForm1.FormDestroy(Sender:TObject);beginCloseHandle(hMutex);end;end.窗體文件:objectForm1:TForm1Left=0Top=0Caption='Form1'ClientHeight=140ClientWidth=192Color=clBtnF
8、aceFont.Charset=DEFAULT_CHARSETFont.Color=clWindowTextFont.Height=-11Font.N