PoEdu培训 Windows班 第四十课 内核对象(七) 信号量和互斥体练习
文章类别: 培训笔记 0 评论

PoEdu培训 Windows班 第四十课 内核对象(七) 信号量和互斥体练习

文章类别: 培训笔记 0 评论

Windows 内核对象(七) 信号量和互斥体练习

今天我们就来写两个有同时运行实例数量限制的程序

互斥体练习 - 单例启动

#include <Windows.h>
#include <tchar.h>

#define LC_ALL 0


INT _tmain()
{
    _tsetlocale(LC_ALL, TEXT(""));
    HANDLE hMutex = INVALID_HANDLE_VALUE;
    do
    {
        hMutex = CreateMutex(NULL, TRUE, TEXT("HadesStartOnceMutex"));
        if (!hMutex)
        {
            _tprintf(TEXT("创建单例互斥体失败!\n"));
            break;
        }
        if (GetLastError() == ERROR_ALREADY_EXISTS)
        {
            _tprintf(TEXT("单例互斥体已存在!\n"));
            break;
        }
        while (TRUE)
        {
            _tprintf(TEXT("程序运行中.....\n");
            Sleep(1000);
        }
    } while (FALSE);

    return 0;
}

信号量练习 - 限制程序启动次数

限制8个实例同时运行

#include <Windows.h>
#include <tchar.h>
#include <cstdio>

#define LC_ALL 0
#define MAX_SEM_NUMBER 8
#define SEM_NAME TEXT("HADES_SEM_LIMIT_NUM_OF_START")

INT _tmain()
{
    _tsetlocale(LC_ALL, TEXT(""));
    HANDLE hSem = INVALID_HANDLE_VALUE;

    do
    {
        hSem = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, SEM_NAME);

        if (!hSem && hSem != INVALID_HANDLE_VALUE)
        {
            hSem = CreateSemaphore(NULL, MAX_SEM_NUMBER, MAX_SEM_NUMBER, SEM_NAME);
        }

        {
            INT nPreSemNum = -1;
            // 为了获取剩余的计数
            if (ReleaseSemaphore(hSem, 1, (LONG*)&nPreSemNum))
            {
                // 将增加的在降回去
                WaitForSingleObject(hSem, INFINITE);
            }
            if (nPreSemNum == 0)
            {
                _tprintf(TEXT("已经达到最大运行次数, 程序退出....\n"));
                break;
            }
            _tprintf(TEXT("第 [%d] 个实例运行....\n"),
                MAX_SEM_NUMBER - (nPreSemNum == -1 ? 8 : nPreSemNum) + 1);
            if (WaitForSingleObject(hSem, 100) != WAIT_TIMEOUT)
            {
                INT nLoopCount = 0;
                while (nLoopCount++ < 60)
                {
                    Sleep(1000);
                }
            }
        }

    } while (FALSE);
    ReleaseSemaphore(hSem, 1, NULL);
    CloseHandle(hSem);
    return 0;
}

未完待续...

如有错误,请提出指正!谢谢.

回复