C++多线程 之 互斥量

C++多线程 之  互斥量

// MutexTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <afxmt.h>
int  n = 100;  // 1 - 100 张票
HANDLE  hMutex;
DWORD WINAPI  ThreadA(LPVOID lpThreadParameter);
DWORD WINAPI  ThreadB(LPVOID lpThreadParameter);
DWORD WINAPI  ThreadC(LPVOID lpThreadParameter);
DWORD WINAPI  ThreadD(LPVOID lpThreadParameter);
DWORD WINAPI  ThreadE(LPVOID lpThreadParameter);
DWORD WINAPI  ThreadF(LPVOID lpThreadParameter);
CRITICAL_SECTION cs;

int main()
{
    //CMutex mutex;        
    InitializeCriticalSection(&cs);
#if 0
    DWORD dwIDA;
    HANDLE hThreadA = CreateThread(nullptr, 0, ThreadA, NULL, CREATE_SUSPENDED, &dwIDA);
    //CloseHandle(hThreadA);
    
    DWORD dwIDB;
    HANDLE hThreadB= CreateThread(nullptr, 0, ThreadB, NULL, CREATE_SUSPENDED, &dwIDB);
    //CloseHandle(hThreadB);
    DWORD dwIDC;
    HANDLE hThreadC = CreateThread(nullptr, 0, ThreadC, NULL, CREATE_SUSPENDED, &dwIDC);
    //CloseHandle(hThreadC);
    ResumeThread(hThreadA);
    ResumeThread(hThreadB);
    ResumeThread(hThreadC);
#endif

    //hMutex = CreateMutex(NULL, FALSE, L"MyMutex");
     hMutex = CreateMutex(NULL, FALSE, NULL);
     
    DWORD dwIDD;
    HANDLE hThreadD = CreateThread(nullptr, 0, ThreadD, NULL, 0, &dwIDD);
    CloseHandle(hThreadD);
    DWORD dwIDE;
    HANDLE hThreadE = CreateThread(nullptr, 0, ThreadE, NULL, 0, &dwIDE);
    CloseHandle(hThreadE);
    DWORD dwIDF;
    HANDLE hThreadF = CreateThread(nullptr, 0, ThreadF, NULL, 0, &dwIDF);
    CloseHandle(hThreadF);
    Sleep(50000);
    return 0;
}


DWORD WINAPI ThreadA(LPVOID lpThreadParameter)
{
    while (n>0)
    {
        EnterCriticalSection(&cs);
        if (n>0)
        {
            printf("ThreadA -- %d \n", n--);
        }
        LeaveCriticalSection(&cs);
        Sleep(0);
    }
    
    return 0;
}


DWORD WINAPI ThreadB(LPVOID lpThreadParameter)
{
    while (n > 0)
    {
        EnterCriticalSection(&cs);
        if (n > 0)
        {
            printf("ThreadB -- %d \n", n--);
        }
        LeaveCriticalSection(&cs);
        Sleep(0);
    }
    return 0;
}


DWORD WINAPI ThreadC(LPVOID lpThreadParameter)
{
    while (n > 0)
    {
        EnterCriticalSection(&cs);
        if (n > 0)
        {
            printf("ThreadC -- %d \n", n--);
        }
        LeaveCriticalSection(&cs);
        Sleep(0);
    }
    return 0;
}


DWORD WINAPI ThreadD(LPVOID lpThreadParameter)
{
    while (true)
    {
        if (n>0)
        {
            WaitForSingleObject(hMutex, 1000);    // 无限等待
            printf("ThreadD --- %d \n", n--);
            Sleep(1000);
            //ReleaseMutex(hMutex);
        }
    }
    return 0;
}


DWORD WINAPI ThreadE(LPVOID lpThreadParameter)
{
    while (true)
    {
        if (n > 0)
        {
            WaitForSingleObject(hMutex, 1000);    // 无限等待
            printf("ThreadE --- %d \n", n--);
            Sleep(1000);
            //ReleaseMutex(hMutex);
        }
    }
    return 0;
}


DWORD WINAPI ThreadF(LPVOID lpThreadParameter)
{
    while (true)
    {
        if (n > 0)
        {
            WaitForSingleObject(hMutex, 500);    // 无限等待
            printf("ThreadF --- %d \n", n--);
            ReleaseMutex(hMutex);
        }
    }
    return 0;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注