事件:

#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. [web] 200 OK (from cache) 与 304 Not Modified

    为什么有的缓存是 200 OK (from cache),有的缓存是 304 Not Modified 呢?很简单,看运维是否移除了 Entity Tag.移除了,就总是 200 OK (from c ...

  2. rsync配置中的auth error,一个隐秘的错误

    我们都知道rsync是linux自带的功能强大的文件同步协议. 为了做免密码文件同步,所以,有多种配置.但是种种配置中,可能会遇到一个让人很纠结的问题,那就是安全认证错误的问题! 这个配置,是基于rs ...

  3. Eclipse设置UTF-8

    将Eclipse所有的设置都设置为UTF-8: 1) Window -> Preferences -> General -> Workspace -> Text file en ...

  4. Angular学习(8)- 路由

    示例: <!DOCTYPE html> <html ng-app="MyApp"> <head> <title>Study 12&l ...

  5. 【linux】grub详解

    参数解释 1. default=0 # default后加一个数字n,表示n+1个“title”操作系统,0表示第一个“title” 的操作系统,以此类推. 2. timeout=0 # timeou ...

  6. linux下的php网站放到Windows服务器IIS下导入 .htaccess文件伪静态规则转换 (wordpress)

    需要特别注意的是: 1. .htacdess文件在 wordpress中 是可以生成的 安装 WP Super Cache后,开启该插件>>设置>>高级>>找到并点 ...

  7. 51nod 1314 定位系统

    一个国家有N个城市(标号为0~N-1),这N个城市恰好由N-1条道路连接在一起(即N个城市正好构成一个树状结构).这个国家的所有道路的长度都是1个长度单位.定义:两个城市间的距离是两个城市间的最短路的 ...

  8. bzoj1966: [Ahoi2005]VIRUS 病毒检测

    Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...

  9. jsonp的简单例子

    jsonp的简单例子 index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...

  10. PHP 正则表达式常用函数使用小结

    在PHP中有两套正则表达式函数库.一套是由PCRE(Perl Compatible Regular Expression)库提供的.PCRE库使用和Perl相同的语法规则实现了正则表达式的模式匹配,其 ...