Windows API ——CreateMutex——創(chuàng)建互斥對象
互斥對象是系統(tǒng)內(nèi)核維護的一種數(shù)據(jù)結(jié)構(gòu),它保證了對象對單個線程的訪問權(quán) 互斥對象的結(jié)構(gòu):包含了一個使用數(shù)量,一個線程ID,一個計數(shù)器 使用數(shù)量是指有多少個線程在調(diào)用該對象,線程ID是指互斥對象維護的線程的ID 計數(shù)器表示當前線程調(diào)用該對象的次數(shù)
?
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, 安全屬性結(jié)構(gòu)指針
BOOL bInitialOwner, //是否占有該互斥量
LPCTSTR lpName //設(shè)置互斥對象的名字
);
?
如果一個線程擁有了一個互斥對象后,當該線程運行完成后就要釋放該互斥對象,不然其他的線程得不到互斥對象則無法運行
用ReleaseMutex(HWND);
它的具體作用是每調(diào)用它一次將互斥對象的計數(shù)器減一,直到減到零為止,此時釋放互斥對象,并將互斥對象中的線程id 置零。 它的使用條件是,互斥對象在哪個線程中被創(chuàng)建,就在哪個線程里面釋放。因為調(diào)用的時候會檢查當前線程的id是不是
與互斥對象中保存的id一致,若一致,則此次操作有效,不一致,則無效。
?
#include
#include
#include
using namespace std;
HANDLE hUp;
CRITICAL_SECTION g_data;
int arr[10];
HANDLE hMutex; //使用手動重置為無信號狀態(tài),初始化時有信號狀態(tài)
UINT __stdcall Add(LPVOID lParam)
{
??? DWORD dReturn = WaitForSingleObject(hMutex,INFINITE);
??? for (int i = 0; i<10;i++ )
??? {
?????? arr[i]=i;//0-9
??? }
??? for (int i = 0;i < 10; i++)
??? {
?????? cout<<arr[i]<<" ";
??? }
??? cout<<endl;
??? ReleaseMutex(hMutex);
??? return 1;
}
UINT __stdcall Add2(LPVOID lParam)
{
?
??? DWORD dReturn = WaitForSingleObject(hMutex,INFINITE);
??? for (int i = 0; i<100 ;i++)
??? {
?????? arr [i] = i+100;//10`1
??? }
??? for (int i = 0;i < 10; i++)
??? {
?????? cout<<arr[i]<<" ";
??? }
??? cout<<endl;
??? ReleaseMutex(hMutex);
??? return 1;
}
int main()
{
?
??? hMutex = CreateMutex(NULL,FALSE,"");
??? hUp=(HANDLE)_beginthreadex(NULL, 0, Add, NULL, NULL, 0);
??? hUp=(HANDLE)_beginthreadex(NULL, 0, Add2, NULL, NULL, 0);
??? Sleep(5000);
}





