Win32线程同步 - 信号量

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/brunomarss/article/details/82984601