多线程编程之Windows同步方式
在Windows环境下针对多线程同步与互斥操作的支持,主要包括四种方式:临界区(CriticalSection)、互斥对象(Mutex)、信号量(Semaphore)、事件对象(Event)。下面分别针对这四种方式作说明:
(1)临界区(CriticalSection)
每个进程中访问临界资源的那段代码称为临界区(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。Windows环境下临界区的基本操作有以下几个:
CRITICAL_SECTION CriticalSection;
InitializeCriticalSection(&CriticalSection);
EnterCriticalSection(&CriticalSection);
LeaveCriticalSection(&CriticalSection);
DeleteCriticalSection(&CriticalSection);
(2)互斥对象(Mutex)
在编程中,引入了对象互斥对象(也叫互斥锁)的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。互斥对象的操作接口有以下几个:
CreateMutex
OpenMutex
ReleaseMutex
在使用互斥对象的时候借助WaitforSingleObject,例如:
WaitForSingleObject(/*...*/);
do_something();
ReleaseMutex(/*...*/);
(3)信号量(Semaphore)
信号量有时被称为信号灯,是在多线程环境下使用的一种设施,它负责协调各个线程,以保证它们能够正确、合理的使用公共资源。也是操作系统中用于控制进程同步互斥的量。信号量分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。与互斥对象相比,信号量就好比是可以容纳N多个人的房子允许多个人同时进入(数量有限制而已),而互斥对象就只能容纳一个人的小房子,同一时刻只能一个人使用。
Windows环境下的信号量操作接口包括:
CreateSemaphore
OpenSemaphore
ReleaseSemaphore
信号量的使用方式与互斥对象差不多,只不过在初始化的时候需要指定信号的个数:
WaitForSingleObject(/*...*/);
do_something();
ReleaseSemaphore(/*...*/);
(4)事件对象(Event)
Event对象是Windows下面很有趣的一种锁结果。从某种意义上说,它和互斥锁很相近,但是又不一样。因为在线程获得锁的使用权之前,常常需要某一个线程(可能是主线程也可能是其他线程)调用SetEvent设置一下才行。关键是,在线程结束之前,我们也不清楚当前线程获得Event之后执行到哪了。所以使用起来,要特别小心。常用的Event对象操作有:
CreateEvent
OpenEvent
PulseEvent
ResetEvent
SetEvent
主线程一般可以这样做:
CreateEvent(/*...*/); // 创建事件对象
SetEvent(/*...*/); // 设置信号
WaitForMultiObjects(hThread, /*...*/); // 等待线程结束
CloseHandle(/*...*/); // 关闭线程句柄
而被启动的线程一般要等待某个事件再进行动作:
while(){
WaitForSingleObject(/*...*/); // 等待事件
/*...*/
}
总结:
(1)关于临界区、互斥区、信号量、Event在msdn上均有示例代码;
(2)一般来说,使用频率上信号量 > 互斥对象 > 临界区 > 事件对象
(3)信号量可以实现其他三种锁的功能,学习上应有所侧重
(4)纸上得来终觉浅,多实践才能掌握它们之间的区别
多线程编程之Windows同步方式的更多相关文章
- 多线程编程之Windows环境下创建新线程
转自: http://www.cnblogs.com/lgxqf/archive/2009/02/10/1387480.html 在 Win32 API 中,创建线程的基本函数是 CreateThre ...
- iOS多线程编程之NSThread的使用
目录(?)[-] 简介 iOS有三种多线程编程的技术分别是 三种方式的有缺点介绍 NSThread的使用 NSThread 有两种直接创建方式 参数的意义 PS不显式创建线程的方法 下载图片的例子 ...
- iOS多线程编程之NSThread的使用(转)
本文由http://blog.csdn.net/totogo2010/原创 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation ...
- [转]iOS多线程编程之NSThread的使用
1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue ...
- iOS多线程编程之NSThread的使用(转载)
1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1.NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的 ...
- [转] iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
介绍: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首 ...
- [转] iOS多线程编程之NSOperation和NSOperationQueue的使用
<iOS多线程编程之NSThread的使用> 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用. 使用 NSOperation的方式有两种, 一种是用定义好 ...
- iOS 多线程编程之Grand Central Dispatch(GCD)
介绍: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其它的对称多处理系统的系统.这建立在任务并行运行的线程池模式的基础上的. 它 ...
- 深入浅出Cocoa多线程编程之 block 与 dispatch quene
深入浅出 Cocoa 多线程编程之 block 与 dispatch quene 罗朝辉(http://www.cppblog.com/kesalin CC 许可,转载请注明出处 block 是 Ap ...
随机推荐
- DB2 函数大全
DB2函数大全 函数名 函数解释 函数举例 AVG() 返回一组数值的平均值. SELECTAVG(SALARY)FROMBSEMPMS; CORR(),CORRELATION() 返回一对数值的关系 ...
- asp.net 中json字符串转换
List<ATTVal> Replys = JsonParser.FromJson<List<ATTVal>>(attrValueStr);
- 2016 ACM/ICPC Asia Regional Shenyang Online 1003/HDU 5894 数学/组合数/逆元
hannnnah_j’s Biological Test Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K ...
- jQuery 事件 - load() 方法
例子:$("img").load(function(){ $("div").text("Image loaded"); }); 定义和用法 ...
- python 文件编码
错误:UnicodeDecodeError: 'gbk' codec can't decode byte 原因:文件为utf-8编码,系统却用gbk去解码,必然出现错误. 解决方法: with ope ...
- 50个C/C++源代码网站(转-清风小阁)
C/C++是最主要的编程语言.这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码 .主要转贴: http://blog.csdn.net/nuoshueihe/article/detai ...
- P168 实战练习(权限修饰符)
创建Game类,运行代码如下: package org.hanqi.pn0120; public class Game { private String name; private String ca ...
- ZOJ-3933 Team Formation (二分图最佳完美匹配)
题目大意:n个人,分为两个阵营.现在要组成由若干支队伍,每支队伍由两个人组成并且这两个人必须来自不同的阵营.同时,每个人都有m个厌恶的对象,并且厌恶是相互的.相互厌恶的人不能组成一支队伍.问最多能组成 ...
- Java设计模式之责任链设计模式
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理 ...
- linux账户管理[转自vbird]
useraddpasswdchageusermoduserdelfingerchfnchshidgroupaddgroupmodgroupdelgpasswd useradd 完全参考默认值创建一个用 ...