- Semaphore信号量 主要用于线程同步,多个线程同时访问一个方法时,如何保证访问有序,不出现紊乱的情况下,就可以使用 Semaphore信号来避免这一问题。
- 使用步骤:
- 1.创建信号量:
HANDLE WINAPI CreateSemaphoreW( __in_opt LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, __in LONG lInitialCount, __in LONG lMaximumCount, __in_opt LPCWSTR lpName ); #ifdef UNICODE #define CreateSemaphore CreateSemaphoreW
- 2.等待信号量结束
WINBASEAPI
DWORD
WINAPI
WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
);
- 3.释放信号量
ReleaseSemaphore
- 实例代码
// SemaphoreControl.cpp : 定义控制台应用程序的入口点。
// 线程同步----信号量控制
#include "stdafx.h"
using namespace std;
HANDLE g_hSemaphore = nullptr; //声明全局信号量
//吃东西
void WINAPI eatFood(LPVOID lpParams)
{
int i = 0;
for (i = 0; i < 20; i++)
{
WaitForSingleObject(g_hSemaphore,INFINITE);
cout << "吃了" << i+1 << "份零食" << endl;
ReleaseSemaphore(g_hSemaphore,1,nullptr);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//创建信号量
g_hSemaphore = CreateSemaphore(NULL,1,1,NULL);
if (!g_hSemaphore)
{
cout << "信号量创建失败" << endl;
}
DWORD threadId = 0;
HANDLE hThread = CreateThread(nullptr,0,(LPTHREAD_START_ROUTINE)eatFood,nullptr,0,&threadId);
HANDLE h1Thread = CreateThread(nullptr,0,(LPTHREAD_START_ROUTINE)eatFood,nullptr,0,&threadId);
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
system("pause");
return 0;
}
运行结果: