前面讲了临界区可以用来达到线程同步.而事件(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. CSS3 @font-face (webfont)

    先大概介绍下计算机领域常见的字体类型与格式. 点阵字体(Bitmap Font)点阵字体也叫位图字体,其中每个字形都以一组二维像素信息表示.这种文字显示方式于较早前的电脑系统(例如未有图形接口时的 D ...

  2. 仿校内textarea输入框字数限制效果

    这是一个仿校内textarea回复消息输入框限制字数的效果,具体表现如下: 普通状态是一个输入框,当光标获取焦点时,出现字数记录和回复按钮 PS:上边那个小三角可不是用的图片. 普通状态效果如下: 获 ...

  3. JQuery实现隔行变色和突出显示当前行 效果

    运行效果如下图: jquery关键代码: <script type="text/javascript"> //该文件为:js.js // 当鼠标移到表格上是,当前一行背 ...

  4. python django学习资料网站

    python module 模块 https://docs.python.org/2.7/py-modindex.html django框架例子 https://docs.djangoproject. ...

  5. c# Random太快产生的随机数会重复

    c# Random快速连续产生相同随机数的解决方案 Random类是一个产生伪随机数字的类,它的构造函数有两种,一个是直接New Random(),另外一个是New Random(Int32),前者是 ...

  6. 短信,微信API(还能发邮件,短信,IM聊天)

    1.用于微信公众平台的Js API(WeixinApi) Github地址:https://github.com/zxlie/WeixinApi http://www.baidufe.com/item ...

  7. Cmake,source_group

    Cmake的source_group命令相当于VS里面给编译需要的文件归类,把一些相同性质的文件放一个类里面,这些“类”,可以在VS 图形界面下左边(一般情况下),看到header文件夹下面的H文件, ...

  8. BZOJ2768: [JLOI2010]冠军调查

    2768: [JLOI2010]冠军调查 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 332[Submit][Status ...

  9. MVC4.0 上传Excel并存入数据库

    这里的这个功能实现在WebForm很好实现,上传阶段简单的一个FileUoLoad控件就搞定了,什么取值,什么上传都是浮云,微软都帮我们封装好了,我们只需要一拖一拽就OK了,但这些在MVC中是不行的! ...

  10. css中的段落样式及背景

    一.段落样式 css中关于段落的样式主要有行高,缩进,段落对齐,文字间距,文字溢出,段落换行等.它们的具体语法如下: line-height : normal | length text-indent ...