CreateEvent进程同步
CreateEvent进程间同步
CreateEvent可以创建或是打开一个命名或是未命名的event对象。
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // pointer to security attributes
BOOL bManualReset, // flag for manual-reset event
BOOL bInitialState, // flag for initial state
LPCTSTR lpName // pointer to event-object name
);
  LPSECURITY_ATTRIBUTES结构体用于创建对象的访问控制属性的,为NULL的话则使用默认的安全描述符,并且对象可被子进程继承。
  bManualReset参数为TRUE时,被创建对象需要手动调用ResetEvent函数恢复为__非信号态__(即不可响应);如果为FALSE,event对象在响应等待线程后自动恢复成非信号态。
  bInitialState参数为TRUE时,被创建的对象初始状态为__信号态__(可响应);否则为非信号态。
lpName参数为event对象名,长度不超过MAX_PATH,字符敏感;如果为NULL,则创建未命名对象。
现在测试一下如何实现进程间同步。
#include "stdio.h"
#include "Windows.h"
int main() {
	HANDLE hEvtObj = NULL;
	DWORD hRet = NULL;
	CHAR objName[] = { "ObjTestEvt_123" };
	if (hEvtObj = CreateEventA(
		NULL,
		TRUE,		// 手动重置为非信号态
		FALSE,		// 初始不可响应
		objName))
	{
		if (ERROR_ALREADY_EXISTS == GetLastError()) { // 事件对象已存在
			printf("Event Obj \"%s\" has EXISTED ...\n", objName);
			for (int i = 0; i < 10;) {			// 响应10次
				hRet = WaitForSingleObject(hEvtObj, 300);	// 超时时间为0.3秒
				if (!hRet) {
					printf("\"%s\" is now SIGNALED %d\n", objName, i++);	// 信号态
				}
				else {
					if (WAIT_TIMEOUT == hRet)
						printf("\"%s\" is now NONSIGNALED\n", objName);		// 非信号态
					else
						printf("Wait Error %#x...\n", GetLastError());
				}
				Sleep(1000);	// 休眠一秒
			}
		}
		else {	// 成功创建事件对象
			printf("Create Evt Obj \"%s\" Successful\n", objName);
			Sleep(1000);		// 等待同步进程运行
			printf("Set Event \"%s\" To SIGNALED  for 4 seconds...\n", objName);
			SetEvent(hEvtObj);		// 设置为事件对象为信号态
			Sleep(4000);			// 休眠4s
			printf("Reset Event \"%s\" To NONSIGNALED for 4 seconds...\n", objName);
			ResetEvent(hEvtObj);	// 设置为非信号态
			Sleep(4000);			// 让事件对象处于非信号态4s
			printf("Set Event \"%s\" To SIGNALED...\n", objName);
			SetEvent(hEvtObj);		//
		}
		CloseHandle(hEvtObj);
		hEvtObj = NULL;
	}
	else {	// 创建失败
		printf("CreateEvent Error = %#x", GetLastError());
	}
	return 0;
}
除了进程间,线程也可使用这种方式。
参考:CreateEvent
CreateEvent进程同步的更多相关文章
- CE 进程同步-事件
		事件(event)分为有名的和无名的,使用有名事件的时候,在不同进程中创建的同名事件,其实就是同一个,这样就可以在不同的进程中使用了.两个进程里面都要创建事件,事件名要一致. //进程1 HANDLE ... 
- [No00003C]操作系统Operating Systems进程同步与信号量Processes Synchronization and  Semaphore
		操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore 进程合作:多进程共同完成一个任务 从纸上到实际:生产者− − ... 
- C++多线程的几个重要方法解析CreateEvent / SetEvent /ResetEvent/ 等
		1.CreateEvent 是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面. 函功能描述:创建或打开一个命名的或无名的事件对象. HANDLE m_hExit; m_hExit= ... 
- 信号量进程同步,王明学learn
		信号量进程同步 一组并发进程进行互相合作.互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步. 信号量在进程同步时初始值为:0 信号量在进程互斥时初始值为:大于0的 本章节主要使用信号量,使的 ... 
- linux C学习笔记02--共享内存(进程同步)
		system V下3中进程同步:共享内存(shared memory),信号量(semaphore)和消息队列(message queue) 调试了下午,终于调通啦! 运行./c.out 输出共享内存 ... 
- Windows API——CREATEEVENT——创建事件
		事件是一个允许一个线程在某种情况发生时,唤醒另外一个线程的同步对象.事件告诉线程何时去执行某一给定的任务,从而使多个线程流平滑 CreateEvent是创建windows事件的意思,作用主要用在判断线 ... 
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
		首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面. CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象. EVENT有两种状态 ... 
- CreateEvent的用法
		事件对象就像一个开关:它只有两种状态---开和关.当一个事件处于”开”状态,我们称其为”有信号”否则称为”无信号”.可以在一个线程的执行函数中创建一个事件对象,然后观察它的状态,如果是”无信号”就让该 ... 
- Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步
		Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步 一.概述 PV操作是对信号量进行的操作. 进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ... 
随机推荐
- spring cloud --- Ribbon 客户端负载均衡 + RestTemplate + Hystrix 熔断器 [服务保护] ---心得
			spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 当超大并发量并发访问一个服务接口时,服务器会崩溃 ,不仅导致这个接口无法 ... 
- NOSQL数据库之MongoDB
			一.NoSQL概述 如今,大多数的计算机系统(包括服务器.PC.移动设备等)都会产生庞大的数据量.其实,早在2012年的时候,全世界每天产生的数据量就达到了2.5EB(艾字节,).这些数据有很大一部 ... 
- HBase环境搭建(hbase1.2.5+zookeeper3.4.6)
			注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6627857018461880836/ 系统版本,Hadoop已安装完成 Mysql安装完成 Hive版本 Sqoo ... 
- 【C primer plus】初始化链表函数的错误
			C primer plus第六版 的一处错误 第五百页17.3.4 实现接口的程序清单17.5中的初始化链表函数有误 #源代码 void InitializeList(List * plist) { ... 
- 【Java】二分法查找
			二分法查找 前提:所要查找的数组必须有序 public class Dichotomy { public static void main(String[] args) { int[] array = ... 
- blender建模常用建模快捷键
			编辑物体 M2选取 M2+SHIFT选取多个 A全选 B+M1矩阵选择 C+M1笔刷选择 CTRL+M1套索选择 CTRL+SHIFT+M1取消套索选择 ALT+M2选择边循环,面 CTRL+ALT+ ... 
- 146_LRU cache | LRU缓存设计
			题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ... 
- 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」系统服务底层原理以及高性能存储设计分析
			设计背景 消息中间件的本身定义来考虑,应该尽量减少对于外部第三方中间件的依赖.一般来说依赖的外部系统越多,也会使得本身的设计越复杂,采用文件系统作为消息存储的方式. RocketMQ存储机制 消息中间 ... 
- 集合框架-工具类-Collections-逆序替换
			1 package cn.itcast.p2.toolclass.collections.demo; 2 3 import java.util.ArrayList; 4 import java.uti ... 
- 使用ansible 批量分发ssh密钥
			先看执行结果 看看ssh.yml怎么写的 看看hosts文件中backup组怎么写的 
