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进程同步的更多相关文章

  1. CE 进程同步-事件

    事件(event)分为有名的和无名的,使用有名事件的时候,在不同进程中创建的同名事件,其实就是同一个,这样就可以在不同的进程中使用了.两个进程里面都要创建事件,事件名要一致. //进程1 HANDLE ...

  2. [No00003C]操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore

    操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore 进程合作:多进程共同完成一个任务 从纸上到实际:生产者− − ...

  3. C++多线程的几个重要方法解析CreateEvent / SetEvent /ResetEvent/ 等

    1.CreateEvent 是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面. 函功能描述:创建或打开一个命名的或无名的事件对象. HANDLE m_hExit; m_hExit= ...

  4. 信号量进程同步,王明学learn

    信号量进程同步 一组并发进程进行互相合作.互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步. 信号量在进程同步时初始值为:0 信号量在进程互斥时初始值为:大于0的 本章节主要使用信号量,使的 ...

  5. linux C学习笔记02--共享内存(进程同步)

    system V下3中进程同步:共享内存(shared memory),信号量(semaphore)和消息队列(message queue) 调试了下午,终于调通啦! 运行./c.out 输出共享内存 ...

  6. Windows API——CREATEEVENT——创建事件

    事件是一个允许一个线程在某种情况发生时,唤醒另外一个线程的同步对象.事件告诉线程何时去执行某一给定的任务,从而使多个线程流平滑 CreateEvent是创建windows事件的意思,作用主要用在判断线 ...

  7. 线程中CreateEvent和SetEvent及WaitForSingleObject的用法

    首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面. CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象. EVENT有两种状态 ...

  8. CreateEvent的用法

    事件对象就像一个开关:它只有两种状态---开和关.当一个事件处于”开”状态,我们称其为”有信号”否则称为”无信号”.可以在一个线程的执行函数中创建一个事件对象,然后观察它的状态,如果是”无信号”就让该 ...

  9. Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步

    Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步 一.概述     PV操作是对信号量进行的操作.     进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ...

随机推荐

  1. spring cloud --- Ribbon 客户端负载均衡 + RestTemplate + Hystrix 熔断器 [服务保护] ---心得

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 当超大并发量并发访问一个服务接口时,服务器会崩溃 ,不仅导致这个接口无法 ...

  2. NOSQL数据库之MongoDB

    一.NoSQL概述 如今,大多数的计算机系统(包括服务器.PC.移动设备等)都会产生庞大的数据量.其实,早在2012年的时候,全世界每天产生的数据量就达到了2.5EB(艾字节,​).这些数据有很大一部 ...

  3. HBase环境搭建(hbase1.2.5+zookeeper3.4.6)

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6627857018461880836/ 系统版本,Hadoop已安装完成 Mysql安装完成 Hive版本 Sqoo ...

  4. 【C primer plus】初始化链表函数的错误

    C primer plus第六版 的一处错误 第五百页17.3.4 实现接口的程序清单17.5中的初始化链表函数有误 #源代码 void InitializeList(List * plist) { ...

  5. 【Java】二分法查找

    二分法查找 前提:所要查找的数组必须有序 public class Dichotomy { public static void main(String[] args) { int[] array = ...

  6. blender建模常用建模快捷键

    编辑物体 M2选取 M2+SHIFT选取多个 A全选 B+M1矩阵选择 C+M1笔刷选择 CTRL+M1套索选择 CTRL+SHIFT+M1取消套索选择 ALT+M2选择边循环,面 CTRL+ALT+ ...

  7. 146_LRU cache | LRU缓存设计

    题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...

  8. 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」系统服务底层原理以及高性能存储设计分析

    设计背景 消息中间件的本身定义来考虑,应该尽量减少对于外部第三方中间件的依赖.一般来说依赖的外部系统越多,也会使得本身的设计越复杂,采用文件系统作为消息存储的方式. RocketMQ存储机制 消息中间 ...

  9. 集合框架-工具类-Collections-逆序替换

    1 package cn.itcast.p2.toolclass.collections.demo; 2 3 import java.util.ArrayList; 4 import java.uti ...

  10. 使用ansible 批量分发ssh密钥

    先看执行结果 看看ssh.yml怎么写的 看看hosts文件中backup组怎么写的