CMutex、CCriticalSection、CSemaphore、CEvent、WaitForSingleObject 的小例子
一、CMutex
CMutex mutex;
mutex.Lock();
//
互斥的动作
//
mutex.Unlock();
二、CCriticalSection
CCriticalSection g_thCurLock;
g_thCurLock.Lock();
//
临界区
//
g_thCurLock.Unlock();
三、CSemaphore
信号量对象的成员函数Lock()将计数器的值 -1,当计数器为0时,就不再允许其他线程访问该资源;而当一个线程使用信号量对象的成员函数Unlock()释放资源时,可以将计数器的值 +1。
因此,信号量对象允许多个线程访问同一个资源,但同时访问该资源的线程总数不能超过信号量对象的最大计数值。
原型: CSemaphore(
LONG lInitialCount /* = 1 */, //计数器的初始值
LONG lMaxCount /* = 1 */, //计数器的最大计数值
LPCTSTR pstrName/* =NULL */, //信号的名称
LPSECURITY_ATTRIBUTES lpsaAttributes /* = NULL */ //指向一个SECURITY_ATTRIBUTES结构的指针
)
CSemaphore semaphoreObj(2,3);
semaphoreObj.Lock();
//
访问资源
//
semaphoreObj.Unlock();
四、CEvent、WaitForSingleObject
#include "afxmt.h"
//定义事件对象和一个字符数组,为了能够在不同线程间使用,定义为全局变量。 CEvent eventWriteD;
char g_Array[10]; //添加线程函数:
UINT WriteW(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
for(int i=0;i<10;i++)
{
g_Array[i]=''W'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
eventWriteD.SetEvent();
return 0; } UINT WriteD(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(eventWriteD.m_hObject,INFINITE);
for(int i=0;i<10;i++)
{
g_Array[i]=''D'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
return 0; }
线程 WiteD 执行到 WaitForSingleObject(eventWriteD.m_hObject,INFINITE) 处等待。
直到执行eventWiteD.SetEvent()后,eventWiteD 为有信号时,该线程才继续往下执行。
因为 eventWriteD 对象是自动事件,当 WriteForSingleObject() 返回时,系统自动把 eventWriteD 对象重置为无信号状态。
如果不是用的 CEvent,而是用 CreateEvent() 创建的事件:
原型:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTESlpEventAttributes,// 安全属性
BOOLbManualReset,// 复位方式
BOOLbInitialState,// 初始状态
LPCTSTRlpName // 对象名称
);
一个Event被 CreateEvent() 创建以后,可以用 OpenEvent() API来获得它的Handle,用 CloseHandle() 来关闭它,用 SetEvent() 或 PulseEvent() 来设置它使其有信号,用 ResetEvent() 来使其无信号,用 WaitForSingleObject() 或 WaitForMultipleObjects() 来等待其变为有信号。
CMutex、CCriticalSection、CSemaphore、CEvent、WaitForSingleObject 的小例子的更多相关文章
- springmvc入门的第一个小例子
今天我们探讨一下springmvc,由于是初学,所以简单的了解一下 springmvc的流程,后续会持续更新... 由一个小例子来简单的了解一下 springmvc springmvc是spring框 ...
- java即时通信小例子
学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...
- Runtime的几个小例子(含Demo)
一.什么是runtime(也就是所谓的“运行时”,因为是在运行时实现的.) 1.runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数); [runti ...
- bootstrap 模态 modal 小例子
bootstrap 模态 modal 小例子 <html> <head> <meta charset="utf-8" /> <title ...
- INI配置文件分析小例子
随手写个解析INI配置字符串的小例子 带测试 #include <iostream> #include <map> #include <string> #inclu ...
- JavaScript小例子:复选框全选
JavaScript小例子:复选框全选 这只是一个小例子,很简单,但是这个功能还是很常用的: 实现后效果如图: JavaScript代码: <script type="text/jav ...
- 【zTree】 zTree使用的 小例子
使用zTree树不是第一次了 但是 还是翻阅着之前做的 对照着 使用起来比较方便 这里就把小例子列出来 总结一下使用步骤 这样方便下次使用起来方便一点 使用zTree树的步骤: 1.首先 在 ...
- js小例子(标签页)
运用js写的一个小例子,实现点击不同的标签出现不同的内容: <!DOCTYPE html> <html> <head> <meta chaset=" ...
- sbrk与brk的使用小例子
sbrk() 和 brk() - Unix的系统函数 sbrk()和brk() 系统的底层会维护一个位置,通过位置的移动完成内存的分配和回收.映射内存时 以一个内存页作为基本单位. void* ...
随机推荐
- java中如何设置下载文件
如果想要设置某一url为下载文件的方法如下 需要设置文件响应类型,使用response.setContentType,比如jpeg格式的图片.如果想要访问该页面时出现下载保存的窗口,使用respons ...
- html中一些常用标签及属性
html中标签分为块级标签和行级标签 块级标签常用的有 <div> <p> <h1><hr><pre><table><ul ...
- ECSHOP后台权限分配原理分析
1.在权限管理->管理员列表,中添加一名管理员 2.在admin\includes\inc_menu.php $modules['02_cat_and_goods']['01_goods_lis ...
- 使用xtrabackup(innobackupex)实现MySQL的热备
mysql 的热备http://www.178linux.com/10139http://www.linuxidc.com/Linux/2014-04/99671.htmhttp://634871.b ...
- VS中一些不常用的快捷键
Ctrl+E,S:将空格以···显示,将tab以→显示 在VS中使用快捷键(Ctrl+E,S),所有代码中的空格都会用小点表示出来,然后...删....不想看就再用一次好了... Ctrl+M,L:快 ...
- vim:关于映射和跳出括号
先说如何自动补全. 命令:vim .vimrc inoremap ( ()<ESC>i inoremap [ []<ESC>i inoremap { {}<ESC> ...
- js实现拉伸拖动iframe的具体代码
这篇文章介绍了js实现拉伸拖动iframe的具体代码,有需要的朋友可以参考一下左边iframe放树目录,右边的iframe放index页.拖鼠标同时控制2个iframe的宽高.期待有人能改进.操作方法 ...
- [na][dhcp]华为DHCP-重要
近日遇到遇到控制器和wac对接的一些问题.尤其是地址池这块排查起来比较费事,且这些命令不容易找到,以下是能经常用到的命令. 1,查看ip是否冲突: (看下conflict字段) 2,防止冲突命令: 3 ...
- ny488 素数环
素数环 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起 ...
- Python中赋值、浅拷贝与深拷贝
python中关于对象复制有三种类型的使用方式,赋值.浅拷贝与深拷贝.他们既有区别又有联系,刚好最近碰到这一类的问题,研究下. 一.赋值 在python中,对象的赋值就是简单的对象引用,这点和C++不 ...