互斥器mutex

    對於多線程,當一個線程1在訪問一個資源A的時候,
    其他線程不能再對資源A進行訪問!
    必須等到線程1不在訪問資源A的時候,其他線程才能去訪問資源A。
==>這就需要做:在多個線程之間做一個同步!

 

 1.創建一個互斥器對象

    hMutex=CreateMutex(NULL,TRUE,NULL);
    參數1(安全屬性):
            NULL-使用默認的安全性;
    參數2(當前創建的這個互斥器的初始擁有者):
            TRUE-調用者創建這個互斥器,調用線程獲得互斥器的所有權;
            FALSE-當前調用線程不獲取互斥器的所有權;
    參數3(互斥器名稱):給創建出來的互斥器/對象,起的一個名字;
            NULL-創建一個沒有名字的互斥對象;
    返回值:這個互斥對象的句柄;

    2.重要內容聲明
    2.1 互斥對象(mutex)屬於內核對象,它能夠確保線程
        擁有對單個資源的互斥訪問權;
    2.2 互斥對象包含:1個使用數量、1個線程ID、1個計數器;
    2.3 ID:用於標識系統中的哪個線程擁有當前的互斥對象;
        計數器:用於指明該線程擁有互斥器對象的次數;

 

#include <windows.h>
//#include <iostream.h>
#include <iostream>

using namespace std;

DWORD WINAPI Fun1Proc(
  LPVOID lpParameter   // thread data
);DWORD WINAPI Fun2Proc(
  LPVOID lpParameter   // thread data
);
int index=0;
int tickets=100; //此時,2個線程會訪問同一個變量,所以會出問題
HANDLE hMutex;
void main()
{
    HANDLE hThread1;
    HANDLE hThread2;
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
    hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
    CloseHandle(hThread1);
    CloseHandle(hThread2);
    /*while(index++<1000)
        cout<<"main thread is running"<<endl;*/
   
    hMutex=CreateMutex(NULL,TRUE,NULL);
    /*hMutex=CreateMutex(NULL,TRUE,"tickets");
    if(hMutex)
    {
        if(ERROR_ALREADY_EXISTS==GetLastError())
        {
            cout<<"only instance can run!"<<endl;
            return;
        }
    }
    WaitForSingleObject(hMutex,INFINITE);
    ReleaseMutex(hMutex);
    ReleaseMutex(hMutex);*/
    //爲了讓線程1和2有時間賣票,這裏將主線程睡眠4s鍾(主線程會在4s以後,繼續執行)
    Sleep(4000); //這時候,主線程是不佔用CPU時間的
    //Sleep(10);
}

DWORD WINAPI Fun1Proc(
  LPVOID lpParameter   // thread data
)
{
    /*while(index++<1000)
        cout<<"thread1 is running"<<endl;*/
    
    //while循環是爲了不斷的銷售火車票。
    //如果不加循環,當賣出一張票之後,線程函數Fun1Proc執行完成,
    //這個線程也就退出了。
    while(TRUE)
    {
        //ReleaseMutex(hMutex);
        //WaitForSingleObject(hMutex,INFINITE);
        //如果還有票,線程1就繼續執行
        {
            if(tickets>0) 
            {
                Sleep(1);
                cout<<"thread1 sell ticket : "<<tickets--<<endl;
            }
            else
                break;
        }
        //ReleaseMutex(hMutex);
    }

    /*WaitForSingleObject(hMutex,INFINITE);
    cout<<"thread1 is running"<<endl;*/
    return 0;
}

DWORD WINAPI Fun2Proc(
  LPVOID lpParameter   // thread data
)
{
    //while循環是爲了不斷的銷售火車票。
    while(TRUE)
    {
        //ReleaseMutex(hMutex);
        //WaitForSingleObject(hMutex,INFINITE);
        {
            //如果還有票,線程2就繼續執行
            if(tickets>0)
            {
                Sleep(1);
                cout<<"thread2 sell ticket : "<<tickets--<<endl;
            }
            else
                break;
        }
        //ReleaseMutex(hMutex);
    }
    //WaitForSingleObject(hMutex,INFINITE);
    //cout<<"thread2 is running"<<endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章