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