Win32线程同步 - 信号量

news/2024/7/8 3:42:49 标签: Win32, 多线程, 线程同步, 信号量, Semaphore

/*

*        说明:使用信号量进行线程同步

*        特点:允许多个线程在同一时刻访问同一资源

*        解释: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;
}

 


http://www.niftyadmin.cn/n/1353736.html

相关文章

Win32线程同步 - 事件

/* * 说明&#xff1a;线程同步中Event对象的使用 * 特点&#xff1a;核心对象 * 目的&#xff1a;成为激发或未激发状态&#xff0c;两种状态完全由程序控制 * 执行状态&#xff1a; * 1. 线程编号的输出没有重复&#xff0c;说明主线…

Win32线程同步 - 原子访问

1. 对原子访问的说明 情形&#xff1a;线程同步中大部分情况与原子访问有关。 作用&#xff1a;原子访问可以保证一个线程在访问资源的同时没有其他线程访问同一资源。 原因&#xff1a;Windows是抢占式多线程环境&#xff0c;多个线程同时操作同一个全局变量时&#xff0c;可能…

ADO编程详解(C++)

一、概述 ADO即Microsoft ActiveXData Object&#xff0c;是Microsoft继ODBC之后&#xff0c;基于OLE DB技术的一种数据库操作技术&#xff0c;使您能够编写通过 OLE DB 提供者对在数据库服务器中的数据进行访问和操作的应用程序。ADO同OLE DB、数据库之间的关系可以用下图来表…

MFC中用c++实现连接SQLServer2008(附操作)

一.安装好vs2015和SQL Server 2008 R2&#xff08;各版本区别不大&#xff09;所以以我现有软件为基础向大家展示一下。 二. 先配置SQL Server 2008 R2 - 在右下角“开始”菜单中点击“所有程序”找到“SQL Server 2008 R2”点击找到“配置工具”找到“SQL Server配置管理器”…

Visual Assist X使用

****部分快捷键ShiftAltF Find References 查找引用 ShiftAltS FindSynbolDialog打开查找符号对话框 AltG GotoImplementation调到实现 AltM ListMethodsInCurrentFile AltLeft Arrow NavigateBack 后台 AltO OpenCurrespondingFile .h/.cpp切换 ShiftAltO OpenFileInSolut…

day1Java入门

Java入门 Java特性和优势 简单性 面向对象 可移植性 高性能 分布式 动态性 多线程 安全性 健壮性 Java三大版本 JavaSE&#xff1a;标准版&#xff08;桌面程序&#xff0c;控制台开发…&#xff09; JavaME&#xff1a;嵌入式开发&#xff08;手机&#xff0c;小…

day2 Java基础

java基础语法 注释 平时我们编写代码&#xff0c;在代码量比较少的时候&#xff0c;我们还可以看懂自己写的&#xff0c;但是项目结构一旦复杂起来&#xff0c;我们就要需要用到注释了。 注释并不会被执行&#xff0c;是给我们写代码的人看的 书写注释是一个非常好的习惯 平…

day06-Debug基础练习

1.Debug 1.1Debug概述 Debug&#xff1a;是供程序员使用的程序调试工具&#xff0c;它可以用于查看程序的执行流程&#xff0c;也可以用于追踪程序执行过来调试程序。 1.2模式操作流程 Debug调试&#xff0c;又被称为断点调试&#xff0c;断点其实是一个标记&#xff0c;告…