版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/brunomarss/article/details/82984601
/*
* 说明:使用信号量进行线程同步
* 特点:允许多个线程在同一时刻访问同一资源
* 解释:Win32中的Semaphore可以被锁住最多n次,其中n是Semaphore被产生时指定的
* 使用:1.多个线程可以同时锁定一个semaphore,不存在拥有权概念
* 2.一旦Semaphore现值降到0,表示资源耗尽,此时任何线程调用必须wait...
*/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
HANDLE g_hSemp = NULL;
DWORD WINAPI ThreadProc1(LPVOID pVoid);
DWORD WINAPI ThreadProc2(LPVOID pVoid);
int main()
{
// 创建信号量
g_hSemp = CreateSemaphore(NULL, 1, 10, NULL);
DWORD nThreadID = 0;
HANDLE hThread[2] = { 0 };
// 创建工作线程
hThread[0] = CreateThread(NULL, 0, ThreadProc1, NULL, 0, &nThreadID);
hThread[1] = CreateThread(NULL, 0, ThreadProc2, NULL, 0, &nThreadID);
// 关闭内核对象
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
CloseHandle(g_hSemp);
// 主线程等待多个工作线程结束返回
WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
system("pause");
return 0;
}
DWORD WINAPI ThreadProc1(LPVOID pVoid)
{
while (true)
{
// 初始化信号量为1,此处等待执行后,线程2无法获得,只能阻塞
WaitForSingleObject(g_hSemp, INFINITE);
printf("我是线程1,执行一下\n");
Sleep(1000); // 线程放弃当前剩余的时间片
// 信号量加1,此时信号量变为1,线程1随即开始wait
// 根据先到先得,这时候线程2获得执行权,执行完之后,又会释放信号量
// 从而实现,线程1执行一次,线程2执行一次,彼此轮询
ReleaseSemaphore(g_hSemp, 1, NULL);
}
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID pVoid)
{
while (true)
{
WaitForSingleObject(g_hSemp, INFINITE);
printf("我是线程2,也要执行一下\n");
Sleep(1000);
ReleaseSemaphore(g_hSemp, 1, NULL);
}
return 0;
}