博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC线程同步方法总结
阅读量:7083 次
发布时间:2019-06-28

本文共 1285 字,大约阅读时间需要 4 分钟。

有四种同步方法:互斥体(Mutex),事件(Event),临界区(Critical Section),以及信号量(Semaphore)。
注:以下所说的“全局变量”也可换为局部变量,只要各线程(包括主线程)能访问即可。

1、使用Mutex

定义全局变量HANDLE hMutex;
在主线程中调用hMutex = CreateMutex(NULL, FALSE, NULL);
(参数的具体含义请查看MSDN)

然后,在子线程中:

WaitForSingleObject(hMutex);

[[受保护的代码]]
ReleaseMutex(hMutex);

2、使用Event

定义全局变量HANDLE hEvent;
在主线中调用hEvent = CreateEvent(NULL,FALSE,TRUE,NULL);
(参数的具体含义请查看MSDN)

然后,在子线程中:

WaitForSingleObject(hEvent);

[[受保护的代码]]
ResetEvent(hEvent);

3、使用CRITICAL_SECTION

定义全局变量CRITICAL_SECTION cs;
在主线中调用InitializeCriticalSection(&cs);
然后,在子线程中:

EnterCriticalSection(&cs);

[[受保护的代码]]
LeaveCriticalSection(&cs);

4、使用Semaphore

定义全局变量HANDLE hSemaphore;
在主线中调用hSemaphore = CreateSemaphore(NULL,lInitialCount,lMaximumCount,NULL);
(参数的具体含义请查看MSDN)

然后,在子线程中:

WaitForSingleObject(hSemaphore);

[[受保护的代码]]
ReleaseSemaphore(hSemaphore,lReleaseCount,NULL);

 

MFC类的情况:
1、使用CMutex
定义全局变量CMutex mutex;
然后,在子线程中:

mutex.Lock();

[[受保护的代码]]
mutex.Unlock();

2、使用CEvent

由于事件(Event)的用法比较复杂,暂时还没弄清楚。

3、使用CCriticalSection

定义全局变量CCriticalSection cs;
然后,在子线程中:

cs.Lock();

[[受保护的代码]]
cs.Unlock();

4、使用CSemaphore

定义全局变量CSemaphore semaphore(lInitialCount, lMaximumCount);
(参数的具体含义请查看MSDN)

然后,在子线程中:

semaphore.Lock();

[[受保护的代码]]
semaphore.Unlock();

以上说法若有任何错误,还请指正。

转载于:https://www.cnblogs.com/xiaopengblog/p/3144144.html

你可能感兴趣的文章
#pragma once与#ifndef #define ...#endif的区别
查看>>
模拟复数及其运算
查看>>
IOS上路_01-Win7+VMWare9+MacOSX10.8+XCode4.6.3
查看>>
给Visual Studio 2010添加Windows Phone 7模板
查看>>
一次 web 工程性能测试
查看>>
wordpress 伪静态nginx设置
查看>>
今天写sql无意中发现了一个深坑
查看>>
记一次dell R720服务器ESXI5.5系统宕机的奇葩经历
查看>>
CMD一键获取 所有连接过的WIFI密码
查看>>
RabbitMQ
查看>>
android 下修改 hosts文件 及 out of memory的解决
查看>>
cocos2d win7 安卓环境配置开发
查看>>
java面试题之六(转)
查看>>
jQuery零基础入门——(六)修改DOM结构
查看>>
Java8 当 Lambda 遇上受检异常
查看>>
什么是竞态条件? 举个例子说明。
查看>>
PM日记:小试1 中午时光
查看>>
opensans字体
查看>>
FLEX入门学习路线图
查看>>
(六)用JAVA编写MP3解码器——帧数据结构
查看>>