资源描述:
《[delphi]多线程编程多线程同步之mutex(互斥对象)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、原理分析:互斥对象是系统内核对象,各线程都可以拥有它,谁拥有谁就能执行;执行完毕,用ReleaseMutex函数释放拥有权,以让其他等待的线程使用.其他线程可用WaitForSingleObject函数排队等候(等候也可以理解为排队申请).使用过程:varhMutex:THandle;{应该先声明一个全局的互斥句柄}CreateMutex{建立一个互斥对象}WaitForSingleObject{用等待函数排队等候}ReleaseMutex{释放拥有权}CloseHandle{最后释放互斥对象}ReleaseMutex、CloseHandle的参数都
2、是CreateMutex返回的句柄,关键是CreateMutex函数:functionCreateMutex(lpMutexAttributes:PSecurityAttributes;bInitialOwner:BOOL;{是否让创建者(此例中是主线程)拥有该互斥对象}lpName:PWideChar{可以给此互斥对象取个名字,如果不要名字可赋值为nil}):THandle;{1、第一个参数前面说过.2、第二个参数在这里一定要是False,如果让主线程拥有互斥,从理论上讲,得等程序退出后其他线程才有机会;取值False时,第一个执行的线程将会最先拥
3、有互斥对象,一旦拥有其他线程就得先等等.3、第三个参数,如果给个名字,函数将从系统中寻找是否有重名的互斥对象,如果有则返回同名对象的存在的句柄;如果赋值为nil将直接创建一个新的互斥对象;下个例子将会有名字.}本例效果图:代码文件:unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;typeTForm1=class(TForm)Button1:TButton;procedureButton1
4、Click(Sender:TObject);procedureFormCreate(Sender:TObject);procedureFormDestroy(Sender:TObject);end;varForm1:TForm1;implementation{$R*.dfm}varf:Integer;{用这个变量协调一下各线程输出的位置}hMutex:THandle;{互斥对象的句柄}functionMyThreadFun(p:Pointer):DWORD;stdcall;vari,y:Integer;beginInc(f);y:=20*f;fori
5、:=0to50000dobeginifWaitForSingleObject(hMutex,INFINITE)=WAIT_OBJECT_0thenbeginForm1.Canvas.Lock;Form1.Canvas.TextOut(20,y,IntToStr(i));Form1.Canvas.Unlock;Sleep(0);{稍稍耽搁一点,不然有时Canvas会协调不过来}ReleaseMutex(hMutex);end;end;Result:=0;end;procedureTForm1.Button1Click(Sender:TObject);v
6、arThreadID: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,nil,0,ThreadID);end
7、;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=clBtnFaceFont.Charset=DEFAU
8、LT_CHARSETFont.Color=clWindowTextFont.Height=-11Font.N