事件:

#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. HTML 属性

    HTML 属性 HTML 元素 HTML 标题 属性为 HTML 元素提供附加信息. HTML 属性 HTML 标签可以拥有属性.属性提供了有关 HTML 元素的更多的信息. 属性总是以名称/值对的形 ...

  2. Hibernate3回顾-4-事务和并发管理

    4.事务和并发 Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的Transaction实际上是底层的JDBC Tra ...

  3. POJ #1042 Gone Fishing - WA by a DP solution. TODO

    I used DP instead of Greedy. But got WA on PoJ, though it passed all web-searched cases. Maybe I hav ...

  4. 【原】Centos 7 下创建LVM流程

    阅读目录 个主分区,1个扩展分区] 或 [4个主分区],扩展分区又可以有多个分区:    window常见的分配方式:        方式1:[1个主分区(C盘)+1个扩展分区(包括3个分区,D,E, ...

  5. c fopen文件读写

    fopen <cstdio> FILE * fopen ( const char * filename, const char * mode ); Open file Opens the ...

  6. VMware和CentOS7安装和配置

    准备工作: 下载: 1.VMware-workstation-full-10.0.0-1295980 2.CentOS-7-x86_64-DVD-1511.iso 安装: 1.VMware-works ...

  7. 在ScrollView中嵌入GridView

    做android程序开发的都知道,不能在一个拥有Scrollbar的组件中嵌入另一个拥有Scrollbar的组件,因为这不科学,会混淆滑动事件,导致只显示一到两行数据.那么就换一种思路,首先让子控件的 ...

  8. linux中deb怎样安装

    deb是Debian Linux的安装格式,跟Red Hat的rpm非常相似,最基本的安装命令是:dpkg -i file.debdpkg 是Debian Package的简写,是为Debian 专门 ...

  9. Porlet标准:JSR168/JSR286/WSRP(转载)

    From:http://www.iteye.com/topic/620213 Portlet标准主要是JSR168,JSR286和WSRP. JSR168因为比较早,所以大部分的Portal都支持这个 ...

  10. 在Linux环境下安装和配置phpmyadmin

    phpmyadmin是一种MySQL的图形化管理工具,该工具允许你在web界面上管理你的mysql数据库,不可谓不方便快捷. 此次安装与配置是在centos 6.4系统下,该系统已部署lnmp环境.关 ...