多线程编程(4) - 多线程同步之 Mutex (互斥对象)
生活随笔
收集整理的這篇文章主要介紹了
多线程编程(4) - 多线程同步之 Mutex (互斥对象)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原理分析:
互斥對象是系統(tǒng)內(nèi)核對象, 各線程都可以擁有它, 誰擁有誰就能執(zhí)行;
執(zhí)行完畢, 用 ReleaseMutex 函數(shù)釋放擁有權(quán), 以讓其他等待的線程使用.
其他線程可用 WaitForSingleObject 函數(shù)排隊等候(等候也可以理解為排隊申請).
使用過程:
ReleaseMutex、CloseHandle 的參數(shù)都是 CreateMutex 返回的句柄, 關(guān)鍵是 CreateMutex 函數(shù):
工作思路:
先用 OpenMutex 嘗試打開一個自定義名稱的 Mutex 對象, 如果打開失敗說明之前沒有這個對象存在;
如果之前沒有這個對象, 馬上用 CreateMutex 建立一個, 此時的程序應(yīng)該是第一次啟動;
再重復(fù)啟動時, 那個 OpenMutex 就有結(jié)果了, 然后強制退出.
最后在程序結(jié)束時用 CloseHandle 釋放 Mutex 對象.
function OpenMutex(dwDesiredAccess: DWORD; {打開權(quán)限}bInheritHandle: BOOL; {能否被當前程序創(chuàng)建的進程繼承}pName: PWideChar {Mutex 對象的名稱} ): THandle; stdcall; {成功返回 Mutex 的句柄; 失敗返回 0}
注意, 這里的 CreateMutex 函數(shù)應(yīng)該有個名了, 因為 OpenMutex 要用到;
另外, CreateMutex 的第二個參數(shù)已經(jīng)不重要了(也就是 True 和 False 都行), 因為這里是用其名稱來判斷的.
程序可以這樣寫:
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs;typeTForm1 = class(TForm)procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}varhMutex: THandle; constNameMutex = 'MyMutex';procedure TForm1.FormCreate(Sender: TObject); beginif OpenMutex(MUTEX_ALL_ACCESS, False, NameMutex) <> 0 thenbeginShowMessage('該程序已啟動');Application.Terminate;end;hMutex := CreateMutex(nil, False, NameMutex); end;procedure TForm1.FormDestroy(Sender: TObject); beginCloseHandle(hMutex); end;end.
這一般都是寫在 dpr 主程序里, 省得讓后啟動的程序執(zhí)行些無用的代碼:
program Project1;usesForms, Windows,Unit1 in 'Unit1.pas' {Form1};{$R *.res}varhMutex: THandle; constNameMutex = 'MyMutex';begin{主線程入口}if OpenMutex(MUTEX_ALL_ACCESS, False, NameMutex) <> 0 thenbeginMessageBox(0, '該程序已啟動', '提示', MB_OK);Application.Terminate;end;hMutex := CreateMutex(nil, False, NameMutex);Application.Initialize;Application.MainFormOnTaskbar := True;Application.CreateForm(TForm1, Form1);Application.Run;CloseHandle(hMutex);{主線程出口} end.
轉(zhuǎn)載于:https://www.cnblogs.com/hnxxcxg/archive/2010/04/21/2940722.html
總結(jié)
以上是生活随笔為你收集整理的多线程编程(4) - 多线程同步之 Mutex (互斥对象)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 水星 MW325R V1~V3 无线路由
- 下一篇: 转:优秀程序员的45个习惯