Win32线程同步 - 互斥器

news/2024/5/19 4:31:45 标签: Win32, 多线程, 线程同步, 互斥器, Mutex

/*

*        说明:Mutex(互斥器)的使用

*        特点:1.一个时间只能有一个线程拥有mutex,这点类似critical section

*                   2.可以跨进程使用,需要创建时指定名称

*                   3.可以指定“结束等待”时间长度

*/

 

	#include <iostream>
	#include <windows.h>
	#include <stdlib.h>
	
	using namespace std;
	
	HANDLE g_hMutex = NULL;
	const int g_Number = 3;
	
	DWORD WINAPI ThreadProc1(__in LPVOID lpParameter);
	DWORD WINAPI ThreadProc2(__in LPVOID lpParameter);
	DWORD WINAPI ThreadProc3(__in LPVOID lpParameter);
	
	int main()
	{
		// 创建互斥器
		g_hMutex = CreateMutex(NULL, FALSE, NULL);	// FALSE代表当前没有线程拥有这个互斥对象
	
		HANDLE hThread[g_Number] = { 0 };
		int first = 1;
		int second = 2;
		int third = 3;
	
		// 创建工作线程
		hThread[0] = CreateThread(NULL, 0, ThreadProc1, (LPVOID)first, 0, NULL);
		hThread[1] = CreateThread(NULL, 0, ThreadProc2, (LPVOID)second, 0, NULL);
		hThread[2] = CreateThread(NULL, 0, ThreadProc3, (LPVOID)third, 0, NULL);
	
		// 线程handle引用计数减1
		CloseHandle(hThread[0]);
		CloseHandle(hThread[1]);
		CloseHandle(hThread[2]);
	
		// 主线程等待多个工作线程
		WaitForMultipleObjects(g_Number, hThread, TRUE, INFINITE);
	
		system("pause");
	
		// 关闭互斥器(核心对象)
		CloseHandle(g_hMutex);
	
		return 0;
	}
	
	DWORD WINAPI ThreadProc1(__in LPVOID lpParameter)
	{
		WaitForSingleObject(g_hMutex, INFINITE);		// 等待互斥量
		cout << (int)lpParameter << endl;
		ReleaseMutex(g_hMutex);					// 释放互斥量
		return 0;
	}
	
	DWORD WINAPI ThreadProc2(__in LPVOID lpParameter)
	{
		WaitForSingleObject(g_hMutex, INFINITE);		
		cout << (int)lpParameter << endl;        
		ReleaseMutex(g_hMutex);                 
		return 0;
	}
	
	DWORD WINAPI ThreadProc3(__in LPVOID lpParameter)
	{
		WaitForSingleObject(g_hMutex, INFINITE);		
		cout << (int)lpParameter << endl;
		ReleaseMutex(g_hMutex);					
		return 0;
	}

 


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

相关文章

Win32线程同步 - 信号量

/* * 说明&#xff1a;使用信号量进行线程同步 * 特点&#xff1a;允许多个线程在同一时刻访问同一资源 * 解释&#xff1a;Win32中的Semaphore可以被锁住最多n次&#xff0c;其中n是Semaphore被产生时指定的 * 使用&#xff1a;1.多个线程可以…

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;是给我们写代码的人看的 书写注释是一个非常好的习惯 平…