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