前面讲了临界区可以用来达到线程同步.而事件(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)的更多相关文章

  1. 经典线程同步 事件Event

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...

  2. 多线程面试题系列(6):经典线程同步 事件Event

    上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的"线程所有权"特性所以关键段只能用于线程的互斥而不能用于同步.本篇介绍用事件Event来尝试解决这个线程同步问题.首先 ...

  3. 转--- 秒杀多线程第六篇 经典线程同步 事件Event

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...

  4. 秒杀多线程第六篇 经典线程同步 事件Event

    原文地址:http://blog.csdn.net/morewindows/article/details/7445233 上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的“线程所有权” ...

  5. python线程的同步事件Event

    Event对象: 用于线程间的通信,某个线程需要根据其他线程的状态来判断自己的下一步操作. Event内部定义了一个全局变量:_flag,默认为False. 当_flag = False时,会阻塞当前 ...

  6. 多线程(三)多线程同步_基本介绍及mutex互斥体

    同步进制的引入为了解决以下三个主要问题:1.控制多个线程之间对共享资源访问,保证共享资源的完整性例如:线程A对共享资源进行写入,线程B读取共享资源2.确保多个线程之间的动作以指定的次序发生例如:线程B ...

  7. nginx&http 第三章 ngx 事件event accept epoll /init

    tcp 三次握手成功后,listen fd  可读,在process_event_timer 中调用rev->handler(rev)处理: 其回调函数为: ngx_event_accept / ...

  8. nginx&http 第三章 ngx 事件event epoll 处理

    1. epoll模块命令集 ngx_epoll_commands  epoll模块上下文 ngx_epoll_module_ctx  epoll模块配置 ngx_epoll_module static ...

  9. Day12- Python基础12 线程、GIL、Lock锁、RLock锁、Semaphore锁、同步条件event

    http://www.cnblogs.com/yuanchenqi/articles/6248025.html  博客地址 本节内容: 1:进程和线程的说明 2:线程的两种调用方式 3:threadi ...

随机推荐

  1. 完全不借助VS,编写C#控制台应用程序

    (因为这个必须要借助控制台,所以必须是控制台应用程序) csc.exe是微软.NET Framework 中的C#编译器 步骤如下: 1)用记事本写一个控制台应用程序的代码,保存在E盘,test.cs ...

  2. windows下配置lamp环境(3)---配置PHP5.4

    下面配置php Php文件夹里有两个php.ini-*文件,随便修改一个,去掉后缀,变成php.ini (如图) 打开php.ini ,添加php扩展目录723行左右(其实放哪都无所谓,只不过php. ...

  3. python学习第十天 -- 函数

    稍微学过其他编程语言的人都应该了解函数的概念.在这里就不做过多的介绍. Python内置了很多有用的函数,我们可以也直接调用. 可以直接从Python的官方网站查看文档: http://docs.py ...

  4. C语言初学 计算二元一次方程的问题

    #include<stdio.h> #include<math.h> int main() { double a,b,c,disc,x1,x2; scanf("%lf ...

  5. Netbeans 注释模板配置

    工具->模板->展开Java 选中Java类->在编辑器中打开 修改如下: <#if package?? && package != ""& ...

  6. android dom方式创建xml

    http://blog.csdn.net/nxh_love/article/details/7085174 在android dom 解析xml方式文章中,简单介绍了dom解析xml的应用.今天在原文 ...

  7. Delphi事件列表赏析(38个事件,必须要对这些事件非常熟悉,才能如臂使指,才能正确发布到新控件!)

    我把Delphi常用的几个类的事件都收集齐了,并一一加以注释.原因是在自定义的过程中,看到那堆长长的事件列表感到头晕,但是如果不发布这些事件的话,更是暴殄天物.所以关键还是要对这些事件非常熟悉,才能不 ...

  8. Powershell过滤管道结果

    通过管道可以过滤某些对象和对象的属性,这个功能很实用,因为很多时候我们并不是对所有的结果感兴趣,可能只会对某些结果感兴趣.如果要过滤对象可以使用Where-Object:如果要过滤对象的属性,可以使用 ...

  9. 基本SQL练习题--选课经典例题

    为管理岗位业务培训信息,建立3个表: S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号.学员姓名.所属单位.学员年龄 C (C#,CN ) C#,CN 分别代表课程编号.课程名称 ...

  10. c语言for语句

    首先呢 for语句是由4部分组成 for(表达式1;表达式2;表达式3) 循环体: 注意 1:循环中的表达式用;隔开 表达式1通常用来呢赋初值 表达式2通常用来循环控制也就是循环条件 表达式3通常就是 ...