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操作是对信号量进行的操作. 进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ...
随机推荐
- console.log(a)和console.log(window.a)的区别?
console.log(window.l); //undefined console.log(l); //Uncaught ReferenceError: l is not defined js对于未 ...
- flutter之搭建环境
一. 环境搭建1.安装Flutter SDK 使用Flutter开发,首先我们需要安装一个Flutter的SDK. 下载Flutter的SDK 来到Flutter的官网网站,选择最新稳定的Flutte ...
- PHP靶场-bWAPP环境搭建
0x00 靶场介绍 bwapp是一款非常好用的漏洞演示平台,包含有100多个漏洞.开源的php应用后台Mysql数据库. 0x01 安装 BWAPP有两种安装方式,一种是单独安装,需部署在Apache ...
- day 16 int *p; scanf("%d",p);问题
(1).以下不能用于描述算法的是[A] (A).E-R图 (B).伪代码 (C).计算机语言 (D).流程图 分析:E-R图也称实体-联系图,提供了表示实体类型.属性和联系的方法,用来描述现实世界的概 ...
- github与gitlab创建新仓库
github创建新仓库 然后根据下一页的命令提示进行即可 gitlab创建新仓库 git init git remote add origin git@***.***.**.**:user/proje ...
- Centos上通过yum命令删除有关MySQL
1.停止mysql 服务service mysql stop 2.刚开始使用的yum安装的,使用以下语句进行卸载 yum remove mysql* 3.然后删除mysql旧版本已经存在的文件或者数据 ...
- 基于SpringBoot如何实现一个点赞功能?
基于SpringBoot如何实现一个点赞功能? 解析: 基于 SpringCloud, 用户发起点赞.取消点赞后先存入 Redis 中,再每隔两小时从 Redis 读取点赞数据写入数据库中做持久化存储 ...
- Git使用简单教程,从建库到远程操作
本地库初始化 找到项目文件->右键git bash->git init 设置签名 形式: 用户名 邮箱地址 作用: 区分不同开发人员身份 注意:这里设置的签名和登录的远程库的账号密码没有任 ...
- 由浅入深,66条JavaScript面试知识点
前言 我只想面个CV工程师,面试官偏偏让我挑战造火箭工程师,加上今年这个情况更是前后两男,但再难苟且的生活还要继续,饭碗还是要继续找的.在最近的面试中我一直在总结,每次面试回来也都会复盘,下面是我这几 ...
- 使用Xamarin开发移动应用示例——数独游戏(二)创建游戏界面
在本系列第一部分,我们创建了程序框架,现在我们创建游戏的界面,项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 首先在View ...