window下線程同步之(Mutex(互斥器) )
阿新 • • 發佈:2018-07-31
nts leo gpo lpm 特點 bar esp div man
?
?
?
使用方法:
1、創建一個互斥器:CreateMutex;
2、打開一個已經存在的互斥器:OpenMutex;
3、獲得互斥器的擁有權:WaitForSingleObject、WaitForMultipleObjects 等一類等待的函數……(可能造成阻塞);
4、釋放互斥器的擁有權:ReleaseMutex;
5、關閉互斥器:CloseHandle;
函數原型:
HANDLE WINAPI CreateMutex( __in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes, __in BOOL bInitialOwner, __in_opt LPCTSTR lpName );
1 2 3 4 5 6 7 8 9 |
lpMutexAttributes : 第一個參數表示安全控制,一般直接傳入NULL。
bInitialOwner第二個參數用來確定互斥量的初始擁有者。
如果傳入TRUE表示互斥量對象內部會記錄創建它的線程的線程ID號並將遞歸計數設置為1,由於該線程ID非零,所以互斥量處於未觸發狀態,表示互斥量為創建線程擁有。
如果傳入FALSE,那麽互斥量對象內部的線程ID號將設置為NULL,遞歸計數設置為0,這意味互斥量不為任何線程占用,處於觸發狀態。
lpName第三個參數用來設置互斥量的名稱,在多個進程中的線程就是通過名稱來確保它們訪問的是同一個互斥量。 |
※ 命名標準:Mutex 可以跨進程使用,所以其名稱對整個系統而言是全局的,所以命名不要過於普通,類似:Mutex、Object 等。
最好想一些獨一無二的名字等!
固有特點(優點+缺點):
1、是一個系統核心對象,所以有安全描述指針,用完了要 CloseHandle 關閉句柄,這些是內核對象的共同特征;
2、因為是核心對象,所以執行速度會比 Critical Sections 慢幾乎100倍的時間(當然只是相比較而言);
3、因為是核心對象,而且可以命名,所以可以跨進程使用;
4、Mutex 使用正確的情況下不會發生死鎖;
5、在“等待”一個 Mutex 的時候,可以指定“結束等待”的時間長度;
6、可以檢測到當前擁有互斥器所有權的線程是否已經退出!Wait……函數會返回:WAIT_ABANDONED
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream>
#include <windows.h>
using namespace std;
HANDLE g_hMutex = NULL;
const int g_Number = 3;
DWORD WINAPI ThreadProc1(__in LPVOID lpParameter);
DWORD WINAPI ThreadProc2(__in LPVOID lpParameter);
DWORD WINAPI ThreadProc3(__in LPVOID lpParameter);
int main()
{
g_hMutex = CreateMutex(NULL,FALSE,NULL);
//TRUE代表主線程擁有互斥對象 但是主線程沒有釋放該對象 互斥對象誰擁有 誰釋放
// FLASE代表當前沒有線程擁有這個互斥對象
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
HANDLE hThread[ g_Number ] = {0};
int first = 1, second = 2, third = 3;
hThread[ 0 ] = CreateThread(NULL,0,ThreadProc1,( LPVOID )first,0,NULL);
hThread[ 1 ] = CreateThread(NULL,0,ThreadProc2,( LPVOID )second,0,NULL);
hThread[ 2 ] = CreateThread(NULL,0,ThreadProc3,( LPVOID )third,0,NULL);
WaitForMultipleObjects(g_Number,hThread,TRUE,INFINITE);
CloseHandle( hThread[0] );
CloseHandle( hThread[1] );
CloseHandle( hThread[2] );
CloseHandle( g_hMutex );
return 0;
}
DWORD WINAPI ThreadProc1(__in LPVOID lpParameter)
{
WaitForSingleObject(g_hMutex, INFINITE); //等待互斥量
cout<<( int )lpParameter<<endl;
ReleaseMutex(g_hMutex); //釋放互斥量
return 0;
}
DWORD WINAPI ThreadProc2(__in LPVOID lpParameter)
{
WaitForSingleObject(g_hMutex, INFINITE); //等待互斥量
cout<<( int )lpParameter<<endl;
ReleaseMutex(g_hMutex); //釋放互斥量
return 0;
}
DWORD WINAPI ThreadProc3(__in LPVOID lpParameter)
{
WaitForSingleObject( g_hMutex, INFINITE); //等待互斥量
cout<<( int )lpParameter<<endl;
ReleaseMutex(g_hMutex); //釋放互斥量
return 0;
}
|
window下線程同步之(Mutex(互斥器) )