msdn中
mutex類
中是這樣解釋的:乙個同步基元,也可用於程序間同步。
其實個人感覺更容易理解的解釋是:
互斥鎖(mutex)
互斥鎖是乙個互斥的同步物件,意味著同一時間有且僅有乙個執行緒可以獲取它。
互斥鎖可適用於乙個共享資源每次只能被乙個執行緒訪問的情況。
如果要獲取乙個互斥鎖。應呼叫互斥鎖上的waitone()方法,該方法繼承於thread.waithandle類。
它處於等到狀態直至所呼叫互斥鎖可以被獲取,因此該方法將組織住主調執行緒直到指定的互斥鎖可用,如果不需要擁有互斥鎖,用releasemutex方法釋放,從而使互斥鎖可以被另外乙個執行緒所獲取。
這是我改自msdn上的方法(其實也沒改多少):
1view codeusing
system;
2using
system.threading;34
class
test
5", i + 1
);16
mythread.start();17}
1819
//20
//run until all foreground threads h**e exited.21}
2223
private
static
void
mythreadproc()
2427
28//
this method represents a resource that must be synchronized
29//
so that only one thread at a time can enter.
30private
static
void
useresource()
31 has entered the protected area",
36thread.currentthread.name);
3738
//place code to access non-reentrant resources here.
3940
//simulate some work.
41 thread.sleep(500
);42
43 console.writeline("
is le**ing the protected area\r\n",
44thread.currentthread.name);
4546
//release the mutex.
47mut.releasemutex();48}
49 }
其實說白了就是:這個坑兒(mutex mutex)誰蹲下,別個就只能等(mutex.waitone();),只有等蹲坑那個人爽完了(mutex.releasemutex();),等待的那個人才能去蹲,然後再讓另外的人去等待....
在程式的program.cs裡面,先新增如下**:
先定義乙個互斥鎖: mutex
bool flag = false; flag);
個引數:
true--給呼叫執行緒賦予互斥體的初始所屬權
//第乙個引數:互斥體的名稱
//第三個引數:返回值,如果呼叫執行緒已被授予互斥體的初始所屬權,則返回true
if (!flag)
}
getexistprocesses()和 setforeground(process instance)的實現如下,這兩個方法的作用就是:如果互斥體發現已經存在同名的互斥,就找到當前同名的程序,然後把這個進行的主窗體顯示到螢幕的最前端。
privateview codestatic process getexistprocess()
}return
null
; }
private
static
bool
isthesamemainmodule(process currentprocess, process process)
catch
(win32exception)
return
true
; }
private
static
void
setforegroundwindow(process instance)
}[dllimport(
"user32.dll
", exactspelling = true
)]
public
extern
static
bool showwindowasync(handleref hwnd, int
ncmdshow);
[dllimport(
"user32.dll
", charset = charset.auto, exactspelling = true
)]
public
extern
static
bool setforegroundwindow(handleref hwnd);
MFC防止同乙個exe應用程式多次啟動
initinstance initinstance afxenablecontrolcontainer 建立 shell 管理器,以防對話方塊包含 任何 shell 樹檢視控制項或 shell 列表檢視控制項。cshellmanager pshellmanager new cshellmanager...
乙個主機同乙個UDP埠,可以開啟幾次
在我的潛意識裡,我一直認為乙個埠只可以開啟1次,如果這個主機有多個網絡卡的話,每個網絡卡都可以在這個埠收發資料,最近一段時間除錯同一主機內不同網絡卡之間 資料的功能,才發現,socket針對同乙個埠不僅可以多次繫結,其中可以根據不同的本地ip多次繫結同一埠,也可以根據繫結不同網絡卡多次繫結同一埠,看...
通過C 開啟乙個應用程式
system.diagnostics.processstartinfo info new system.diagnostics.processstartinfo 設定外部程式名 info.filename eclipse.exe 設定外部程式工作目錄為 c info.workingdirectory...