MFC线程(三):线程同步事件(event)与互斥(mutex)
前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到.
Win32 API中的线程事件
HANDLE hEvent = NULL;
void MainTestFun{
hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(hEvent);
char g_charArray[4];
CString szResult;
//下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问
AfxBeginThread(FunOne,NULL); //FunOne给数组赋值全为S
AfxBeginThread(FunTwo,NULL); //FunTwo也给数组赋值全为B
AfxBeginThread(GetResult,); //返回BBBB
}
//其他两个函数FunOne或GetResult也同样添加两行这样的代码.这两函数的定义见上一篇http://blog.csdn.net/weiwenhp/article/details/8650896
UINT FunOne(LPVOID pParam){
WaitForSingleObject(hEvent, INFINITE); //类似EnterCriticalSection,这里的INFINITE表示会一直等其他的线程执行完了再执行.如果写成1000则表示只等1秒钟.1秒内
//其他线程还没有释放资源则该线程自动中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
SetEvent(hEvent); //类似LeaveCriticalSection
return 0;
}
MFC中的线程事件类
CEvent g_cEvent; //实例化一个事件类
void MainTestFun{
g_cEvent.SetEvent();
char g_charArray[4];
CString szResult;
//下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问
AfxBeginThread(FunOne,NULL); //FunOne给数组赋值全为S
AfxBeginThread(FunTwo,NULL); //FunTwo也给数组赋值全为B
AfxBeginThread(GetResult,); //返回BBBB
}
//其他两个函数FunOne或GetResult也同样添加两行这样的代码.这两函数的定义见上一篇http://blog.csdn.net/weiwenhp/article/details/8650896
UINT FunOne(LPVOID pParam){
WaitForSingleObject(g_cEvent, INFINITE); //类似EnterCriticalSection
//其他线程还没有释放资源则该线程自动中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
g_cEvent.SetEvent(); //类似LeaveCriticalSection
return 0;
}
Win32 API中的互斥(mutex)
HANDLE hMutex = NULL;
void MainTestFun{
hMutex= CreateMutex(NULL,FALSE,NULL);
char g_charArray[4];
CString szResult;
//下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问
AfxBeginThread(FunOne,NULL); //FunOne给数组赋值全为S
AfxBeginThread(FunTwo,NULL); //FunTwo也给数组赋值全为B
AfxBeginThread(GetResult,); //返回BBBB
}
//其他两个函数FunOne或GetResult也同样添加两行这样的代码.这两函数的定义见上一篇http://blog.csdn.net/weiwenhp/article/details/8650896
UINT FunOne(LPVOID pParam){
WaitForSingleObject(hMutex, INFINITE);//类似EnterCriticalSection,这里的INFINITE表示会一直等其他的线程执行完了再执行.如果写成1000则表示只等1秒钟.1秒内
//其他线程还没有释放资源则该线程自动中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
ReleaseMutex(hMutex );//类似LeaveCriticalSection
return 0;
}
MFC中的互斥类(CMutex)
CMutex g_cMutex;
void MainTestFun{
char g_charArray[4];
CString szResult;
//下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问
AfxBeginThread(FunOne,NULL); //FunOne给数组赋值全为S
AfxBeginThread(FunTwo,NULL); //FunTwo也给数组赋值全为B
AfxBeginThread(GetResult,); //返回BBBB
}
//其他两个函数FunOne或GetResult也同样添加两行这样的代码.这两函数的定义见上一篇http://blog.csdn.net/weiwenhp/article/details/8650896
UINT FunOne(LPVOID pParam){
g_cMutex.Lock();//类似EnterCriticalSection,这里的INFINITE表示会一直等其他的线程执行完了再执行.如果写成1000则表示只等1秒钟.1秒内
//其他线程还没有释放资源则该线程自动中止.
for(int i =0; i < 4; i++){
g_charArray[i] = 'S';
Sleep(1);
}
g_cMutex.Unlock();//类似LeaveCriticalSection
return 0;
}
MFC线程(三):线程同步事件(event)与互斥(mutex)的更多相关文章
- 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
- 多线程面试题系列(6):经典线程同步 事件Event
上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的"线程所有权"特性所以关键段只能用于线程的互斥而不能用于同步.本篇介绍用事件Event来尝试解决这个线程同步问题.首先 ...
- 转--- 秒杀多线程第六篇 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
- 秒杀多线程第六篇 经典线程同步 事件Event
原文地址:http://blog.csdn.net/morewindows/article/details/7445233 上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的“线程所有权” ...
- python线程的同步事件Event
Event对象: 用于线程间的通信,某个线程需要根据其他线程的状态来判断自己的下一步操作. Event内部定义了一个全局变量:_flag,默认为False. 当_flag = False时,会阻塞当前 ...
- 多线程(三)多线程同步_基本介绍及mutex互斥体
同步进制的引入为了解决以下三个主要问题:1.控制多个线程之间对共享资源访问,保证共享资源的完整性例如:线程A对共享资源进行写入,线程B读取共享资源2.确保多个线程之间的动作以指定的次序发生例如:线程B ...
- nginx&http 第三章 ngx 事件event accept epoll /init
tcp 三次握手成功后,listen fd 可读,在process_event_timer 中调用rev->handler(rev)处理: 其回调函数为: ngx_event_accept / ...
- nginx&http 第三章 ngx 事件event epoll 处理
1. epoll模块命令集 ngx_epoll_commands epoll模块上下文 ngx_epoll_module_ctx epoll模块配置 ngx_epoll_module static ...
- Day12- Python基础12 线程、GIL、Lock锁、RLock锁、Semaphore锁、同步条件event
http://www.cnblogs.com/yuanchenqi/articles/6248025.html 博客地址 本节内容: 1:进程和线程的说明 2:线程的两种调用方式 3:threadi ...
随机推荐
- poi实现Excel导出
最近做了一个导出Excel的小功能,以前没接触过,现在分享下自己的代码,想让各位帮忙看看有啥地方可以优化,也方便自己以后查阅... 首先是excelAction的代码: /** * excelActi ...
- 腾讯的一道js面试题(原型)
有一只小狗叫花花,它会“汪汪”叫,他的同伴也会汪汪叫,后来环境发生了变化,新出生的狗不会再“汪汪”叫,而变成“呜呜”叫. 试通过继承来达到目的 function Dog(){ 2 this.bark ...
- js版iphone通讯录分组列表效果
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...
- stack适配栈
#include <stack> stack<int> s; s.empty() 如果栈为空,则返回 true,否则返回 stack s.size() 返回栈中元素的个数 s. ...
- 【南阳OJ分类之语言入门】80题题目+AC代码汇总
小技巧:本文之前由csdn自动生成了一个目录,不必下拉一个一个去找,可通过目录标题直接定位. 本文转载自本人的csdn博客,复制过来的,排版就不弄了,欢迎转载. 声明: 题目部分皆为南阳OJ题目. 代 ...
- iOS开发:自定义tableViewCell处理的问题
还在适配iOS6,索性下一个版本不适配了~~~~~ 问题: *** Assertion failure in -[ PCDiaryDetailReplyCell layoutSublayersOfLa ...
- ThrottleStop
ThrottleStop 我的要开这个软件,睿频才能开.不然一直工作在1.8Ghz下默认频率太低了开了这个速度才有提升
- Linux企业级项目实践之网络爬虫(9)——通过URL抓取网页内容
基本URL包含模式(或称协议).服务器名称(或IP地址).路径和文件名,如"协议://授权/路径?查询".完整的.带有授权部分的普通统一资源标志符语法看上去如下:协议://用户名: ...
- 关于Set Nocount ON的性能 |c#调用存储过程的返回值总是-1
原文地址:http://www.tuicool.com/articles/qe6BZbR 也许因为它太过于简单,自己一直没能好好关注这个语句,只记得"只是"提高点性能而已.有时会在存储过程中写上几句, ...
- JFrame编程
最基础的窗口 public test1() { setTitle("test1"); setSize(300,300); //设置窗口大小 setLocation(300,300) ...