事件:

#include <Windows.h>
#include <iostream>
DWORD WINAPI Func1Pro(LPVOID lpParameter);
DWORD WINAPI Func2Pro(LPVOID lpParameter);
int tickets = ;
HANDLE g_hEvent;
void main()
{ HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL, , Func1Pro, NULL, , NULL);
hThread2 = CreateThread(NULL, , Func2Pro, NULL, , NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
// g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //人工重置的事件对象, 初始信号状态设置为无信号状态
//g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //自动重置事件对象, 初始信号状态设置为无信号状态
g_hEvent = CreateEvent(NULL, FALSE, FALSE, "tickets");
if(g_hEvent)
{
//带名字的事件对象也是系统唯一的, 可以判断实例
if(ERROR_ALREADY_EXISTS == GetLastError())
{
std::cout<< "only instance can run!" << std::endl;
return;
}
}
SetEvent(g_hEvent);//人工重置的事件对象, 会将所有线程的事件信号状态都改变 ResetEvent改成无信号
Sleep();
CloseHandle(g_hEvent);
}
DWORD WINAPI Func1Pro(LPVOID lpParameter)
{ while(TRUE)
{
WaitForSingleObject(g_hEvent, INFINITE); //如果是自动重置事件对象 处理时, 会改成非信号状态
if(tickets > )
{
Sleep();
std::cout << "thread1 sell ticket: " << tickets-- << std::endl;
}
else
break;
SetEvent(g_hEvent); //再设置为有信号状态
}
return ;
}
DWORD WINAPI Func2Pro(LPVOID lpParameter)
{ while(TRUE)
{
WaitForSingleObject(g_hEvent, INFINITE);//如果是自动重置事件对象 处理时, 会改成非信号状态
if(tickets > )
{
Sleep();
std::cout << "thread2 sell ticket: " << tickets-- << std::endl;
}
else
break;
SetEvent(g_hEvent); //再设置为有信号状态
}
return ;
}

临界区:

#include <Windows.h>
#include <iostream>
DWORD WINAPI Func1Pro(LPVOID lpParameter);
DWORD WINAPI Func2Pro(LPVOID lpParameter);
int tickets = ;
CRITICAL_SECTION g_cs;
void main()
{ HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL, , Func1Pro, NULL, , NULL);
hThread2 = CreateThread(NULL, , Func2Pro, NULL, , NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
InitializeCriticalSection(&g_cs); //初始化临界区对象
Sleep();
DeleteCriticalSection(&g_cs);
}
DWORD WINAPI Func1Pro(LPVOID lpParameter)
{ while(TRUE)
{
EnterCriticalSection(&g_cs); //检查是否能进入临界区
if(tickets > )
{
Sleep();
std::cout << "thread1 sell ticket: " << tickets-- << std::endl;
}
else
break;
LeaveCriticalSection(&g_cs); }
return ;
}
DWORD WINAPI Func2Pro(LPVOID lpParameter)
{ while(TRUE)
{
EnterCriticalSection(&g_cs);
if(tickets > )
{
Sleep();
std::cout << "thread2 sell ticket: " << tickets-- << std::endl;
}
else
break;
LeaveCriticalSection(&g_cs);
}
return ;
}

下载代码

MFC学习 事件临界区的更多相关文章

  1. MFC 学习之 鼠标移动到Toolbar按钮上显示提示信息(tooltip),状态栏也随之改变

    1.在ResourceView里加入Toolbar资源,命名IDR_TOOLBAR1 2.在主程序的.h文件中加入变量:           CToolBar m_toolbar;CImageList ...

  2. jQuery学习-事件之绑定事件(三)

    在上一篇<jQuery学习-事件之绑定事件(二)>我们了解了jQuery的dispatch方法,今天我们来学习下handlers 方法: handlers: function( event ...

  3. jQuery学习-事件之绑定事件(二)

    在上一篇<jQuery学习-事件之绑定事件(一)>我们了解了jQuery的add方法,今天我们来学习下dispatch方法: dispatch: function( event ) {   ...

  4. MFC学习笔记1---准备工作

    什么是MFC MFC,全称Microsoft Foundation Classes,微软基础类库,顾名思义,是微软的攻城狮们将一些常用的基础的Windows API 函数用C++的形式封装成类,简化程 ...

  5. MFC 学习笔记

    MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...

  6. MFC学习问题总结

    1.学习MFC添加位图,无法获取其ID 1).点击视图->其他窗口->资源视图,你会发现“无法在此窗口显示”,找到resource.h文件,关闭即可重新走一遍上面的过程就会发现可以打开了. ...

  7. MFC学习笔记2---简单计算器

    前言 学习了鸡啄米网页的前三部分后,我们就可以做一个小软件出来了,我选择先做一个计算器. 这是Win7系统自带的计算器: 为了提升成就感,我将计算器的大部分内容去除,于是就变成这样: 这样就只剩下了1 ...

  8. MFC学习笔记(一)

    个人对MFC技术一直都很感兴趣,因为能够做出漂亮绚丽的界面应该是一件十分有成就感的事情. 学习的参考课本为北京博彦科技发展有限责任公司翻译的Jeff Prosise著的<MFC Windows程 ...

  9. 孙鑫MFC学习笔记16:异步套接字

    16 1.事件对象 2.CreateEvent创建事件对象 3.SetEvent设置事件对象为通知状态 4.ResetEvent设置事件对象为非通知状态 5.InitializeCriticalSec ...

随机推荐

  1. ajax用户名案例(重点)

      要求:失去焦点时如下效果 主页代码 <body> 用户名:<input type="text" id="a" /><div i ...

  2. MongoDB shell 格式化

    直接的方法: db.collection.find().pretty(); 如果想要所有的查询都格式化,可以执行: echo "DBQuery.prototype._prettyShell ...

  3. HackerRank "Bike Racer"

    Just for study from its editorial~ Lesson learnt: an optimized Hungarian Algorithm: Hopcroft-Karp Al ...

  4. SoPC/Qsys杂谈

    1. 如果你想把Reset Vector放在EPCS Controller里面,记得将CPU core的Instruction Master和Data Master都连接到EPCS Controlle ...

  5. windows mobile 共享PC网络(win7)

    win7系统安装windows mobile,将设备插入底座后,设备并不能直接共享pc的网络直接上网.原来,当插入底座后,需要打开mobile设备中心,切换一下连接网络,或者打开此窗体后确定一下,即可 ...

  6. windows mobile仿真器内存调整

    1.打开VS,进入工具,选项. 2.点击设备,在右侧选中要调整的模拟器,点属性. 3.点击仿真器选项. 4.勾选 指定RAM大小. 5.重启仿真管理器.

  7. Oracle-单表合并列

    表基本结构 合并列 select t.student,decode(t.java,'','','java') 科目, t.java from student t union select t.stud ...

  8. HTTP协议的安全性--全站HTTPS

    HTTP Basic Authentication很容易让攻击者监听并获取用户名密码.使用Base64来encode用户名密码也只是为将用户名和口令中的不兼容字符转换为均与HTTP协议兼容的字符集. ...

  9. [CSS]如何正确使用ID和Class?

    作者:DarkZone链接:https://www.zhihu.com/question/19550864/answer/23440690来源:知乎 以下摘自<精通CSS:高级Web标准解决方案 ...

  10. 在编译oc中protocol时出现的错误

    Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang ...