Windows API ——CreateMutex——創建互斥對象

互斥對象是系統內核維護的一種數據結構,它保證了對象對單個線程的訪問權   互斥對象的結構:包含了一個使用數量,一個線程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);

}

發佈了13 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章