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;
}未完待续...
如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2017-07-07 at 02:06 pm