文档章节

线程同步 内核对象比较

ucliaohh
 ucliaohh
发布于 2016/10/13 13:29
字数 560
阅读 10
收藏 0

临界区:一种保证在某一时刻只有一个线程能访问数据的简便办法。它只可以在同一进程内部使用。   对线程的串行化方法来访问公共资源或一段代码,速度快,适合控制数据访问。

主要API函数       产生临界区: InitializeCriticalSection

                              删除临界区: DeleteCriticalSection

                              进入临界区: EnterCriticalSection

                              退出临界区: LeaveCriticalSection

 

互斥对象:互斥对象跟临界区相似,但它不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享,当然下面两者也有这个特点。 只有拥有互斥对象的线程才有访问公共资源的权限。互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。

主要API函数        创建互斥量: CreateMutex

                              打开一个存在的互斥量: OpenMutex

                              释放互斥量的使用权:ReleaseMutex

                              关闭互斥量:CloseHandle

 

信号量:使用信号量(信标)最重要用途是:信号允许多个线程同时使用共享资源,它指出了同时访问共享资源的线程最大数目。

主要API函数( 函数和使用方法都与互斥对象相似)  

                            创建信号量:CreateSemaphore  传入的参数可以指定信号量的初始值。

                                       ReleaseSemaphore

 

事件:用来通知其他进程/线程某件操作已经完成。还可以实现对多个线程的优先级比较的操作。

API函数有创建,打开事件对象等

特殊点的是可以用函数SetEvent人工设置事件为有无信号状态,
因此创建事件对象时可以有两种方式,一种为自动重置,一种为人工重置。

只有人工重置方式创建的事件对象才能正确使用函数SetEvent。

 

在MFC中对于各种同步对象都提供了相对应的类CCtiticalSection,CMutex,CSemaphore ,CEvent,
另外为使用等待功能封装了两个类:CSingleLock和CMultiLock。这些类方便了使用这些同步对象

© 著作权归作者所有

ucliaohh
粉丝 3
博文 105
码字总数 58328
作品 0
其它
高级程序员
私信 提问
多线程编程--5种方法实现线程同步

1:用Interlocked系列函数实现线程同步; 2:用CRITICAL_SECTION及其系列函数实现线程同步; 3:用RTL_SRWLOCK及其系列函数实现线程同步; 4:用事件内核对象实现线程同步; 5:用信号量内核...

长征2号
2018/01/11
0
0
用C++实现多线程Mutex锁(Win32)

本文目的:用C++和Windows的互斥对象(Mutex)来实现线程同步锁。 准备知识:1,内核对象互斥体(Mutex)的工作机理,WaitForSingleObject函数的用法,这些可以从MSDN获取详情; 2,当两个或...

鉴客
2011/12/10
6.5K
1
Windows下Critical Section、Event、Mutex、Semaphores区别

临界区(Critical Section) 用户进程对数据的互斥访问,保证在某一时刻只有一个线程能访问临界区。如果有多个线程试图同时访问临界区,那么在有一个线程进入临界区后其他试图访问的线程将被...

西昆仑
2011/07/08
0
0
【synchronized底层原理之2】悲观锁与乐观锁、线程阻塞的代价等

悲观锁与乐观锁 悲观锁(Pessimistic Lock) 悲观锁是就是悲观思想,即认为写多,遇到并发写的可能性高,每次去拿数据的时候都认为别人会修改,所以每次在读写数据的时候都会上锁,这样别人想...

karma123
2018/09/10
0
0
JVM—虚拟机内存模型与高效并发

Java内存模型,即Java Memory Model,简称 ,它是一种抽象的概念,或者是一种协议,用来解决在并发编程过程中内存访问的问题,同时又可以兼容不同的硬件和操作系统,JMM的原理与硬件一致性的...

Java大蜗牛
2018/07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux下ctrl+c中止不了

有一台centos7的服务器,ctrl+c无效,并且tail -f也无效,只能关掉终端或者crtl+z放入后台再删掉,但是ping的时候使用ctrl+c是有效果的。 出现这种情况的原因可能是因为有人要使用ruby安装r...

gaolongquan
22分钟前
1
0
Android三年工作面经

工作三年出来看看新的机会,依次面试过如下公司: 小米(北京) iHandy(北京) 涂鸦智能(杭州) 微软(北京) 宜信(北京) 蚂蚁金服(杭州) 瓜子二手车(北京) 高德(北京) 基本上投递的简历都得到了面...

JerryLin123
25分钟前
2
0
开发函数计算的正确姿势——tensorflow serving

前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计...

阿里云云栖社区
29分钟前
6
0
社区角色(Kubernetes社区Maintainer是什么角色?)

社区成员按照角色,分为member、reviewer、approver、subproject owner。 下面我们介绍一下每个角色的职责和要求。 member reviewer approver subproject owner...

恋恋美食
46分钟前
1
0
【JavaScript】callee 与 caller

callee callee是函数参数arguments对象的一个属性,它指向参数arguments对象所在的函数自身。 function foo (x) {console.log(arguments.callee);return x;}foo(); 从控制台中可以看...

小草先森
49分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部