线程的同步控制(Synchronization)
临界区(Critical Sections)
摘要
- 临界区(Critical Section) 用来实现“排他性占有”。适合范围时单一进程的各线程之间。
- 特点
- 一个局部对象,不是一个核心对象
- 快速而有效率
- 不能够同时有一个以上的Critical Section被等待
- 无法侦测是否已经被某个线程放弃
- 相关函数
- 定义:CRITICAL_SECTION
- 初始化:InitializaCriticalSection()
- 进入:EnterCriticalSection()
- 离开:LeaveCriticalSection()
- 删除:DeleteCriticalSection()
- 死锁(deadlock)
- 任何时候当一段代码需要两个(或更多)资源时,都有潜在性的死锁阴影。如哲学家进餐问题。
互斥器(Mutexes)
- 摘要
- Mutex 是一个核心对象,可以在不同的线程之间实现“排他性占有”,甚至即使那些线程分属不同进程。
- 特点
- 一个核心对象
- 如果拥有Mutex的那个线程结束,则会产生一个“abandoned" 错误信息
- 可以使用Wait...() 等待一个或多个mutex
- 可以具名,因此可以被其他进程开启
- 只能被拥有它的那个线程释放
- 相关函数
- 定义:Mutex
- 产生:CreateMutex()
- 打开:openMutex()
- 等待(或进入):WaitForSigleObject()、WaitForMultipleObjects()、MsgWaitForMultipleObjects()
- 释放:ReleaseMutex()
- 删除:CloseHandle()
- Mutex 和 Critical Section 对比
- 锁住一个未被拥有的Mutex,比锁住一个未被拥有的critical section,需要花费几乎100倍的时间。因为critical section 运行在usermode。
- Mutexes 可以跨进程使用个。Critical Section 只能够在同一个进程中使用
- 等待一个Mutex时,可以指定“结束等待”的时间长度。critical section则不行。
- Mutex可以设置同时等待多个,critical section只能等待一个
- 摘要
信号量(Semaphores)
- 摘要
- Semaphores被用来追踪有限的资源
- 特点
- 是一个核心对象
- 没有拥有者
- 可以具名,因此可以被其他进程开启
- 可以被任何一个线程释放
- 相关函数
- 产生:CreateSamaphore()
- 获取:WaitForSingleObject()、WaitForMultipleObjects()
- 解除:ReleaseSemaphore()
- 摘要
事件(Event)
- 摘要
- Event Object 通常使用于overlapped I/O,或用来设计某些自定义的同步对象
- 特点
- 是一个核心对象
- 完全在程序的掌握之下
- 适用于设计新的同步对象
- “要求苏醒”的请求并不会被存储起来,可能会遗忘掉
- 可以具名,因此可以被其他进程开启
- 相关函数
- 产生:CreateEvent()
- 激发:SetEvent()
- 复位:ResetEvent()
- 激发:PulseEvent()
- 激发函数比较
- 自动模式(Auto Reset Event):
- PulseEvent和SetEvent作用相同,调用后正在等候事件的,被挂起的单个线程会进入活动状态,事件随后设回无信号。
- 手动模式(Manual Reset Event):
- PulseEvent:调用后正在等候事件的,被挂起的单个线程会进入活动状态,事件随后设回无信号。
- SetEvent:调用后正在等候事件的,被挂起的所有线程会进入活动状态,需要等待ResetEvent调用才能将事件设回无信号。
- 自动模式(Auto Reset Event):
- 摘要
Interlocked Variable
- 摘要
- 如果Interlocked...() 函数被使用于所谓的spin-lock,那么他们只是一种同步机制。所谓spin-lock是一种busy loop,被预期在极短时间内执行,所以有最小的额外负担(overhead)。系统核心偶尔会使用他们。除此只外,Interlocked variable 主要用于引用计数。
- 特点
- 运行对4字节的数值有些基本的同步操作,不需动用critical section 或 Mutex 之类
- 在SMP(Symmetric Multi-Processors)操作系统中亦可有效运作
- 相关函数
- 加一:InterlockedIncrement()
- 减一:InterlockedDecrement()
- 设值:InterlockedExchange
- 摘要
线程的同步控制(Synchronization)的更多相关文章
- 线程的同步控制synchronized和lock的对比和区别
转载. https://blog.csdn.net/wu1226419614/article/details/73740899 我们在面试的时候,时常被问到如何保证线程同步已经对共享资源的多线程编程 ...
- 第4章 同步控制 Synchronization ----同步机制的摘要
同步机制摘要Critical Section Critical section(临界区)用来实现"排他性占有".适用范围是单一进程的各线程之间.它是: 一个局部性对象,不是一个核 ...
- 第4章 同步控制 Synchronization ----事件(Event Objects)
Win32 中最具弹性的同步机制就属 events 对象了.Event 对象是一种核心对象,它的唯一目的就是成为激发状态或未激发状态.这两种状态全由程序来控制,不会成为 Wait...() 函数的副作 ...
- 第4章 同步控制 Synchronization ----信号量(Semaphore)
许多文件中都会提到 semaphores(信号量),因为在电脑科学中它是最具历史的同步机制.它可以让你陷入理论的泥淖之中,教授们则喜欢问你一些有关于信号量的疑难杂 症.你可能不容易找到一些关于 sem ...
- 第4章 同步控制 Synchronization ----互斥器(Mutexes)
Win32 的 Mutex 用途和 critical section 非常类似,但是它牺牲速度以增加弹性.或许你已经猜到了,mutex 是 MUTual EXclusion 的缩写.一个时间内只能够有 ...
- 第4章 同步控制 Synchronization ----死锁(DeadLock)
Jeffrey Richter 在他所主持的 Win32 Q&A 专栏(Microsoft Systems Journal,1996/07)中曾经提到过,Windows NT 和 Window ...
- 第4章 同步控制 Synchronization ----critical section 互斥区 ,临界区
本章讨论 Win32 同步机制,并特别把重点放在多任务环境的效率上.撰写多线程程序的一个最具挑战性的问题就是:如何让一个线程和另一个线程合作.除非你让它们同心协力,否则必然会出现如第2章所说的&quo ...
- java线程的同步控制--重入锁ReentrantLock
我们常用的synchronized关键字是一种最简单的线程同步控制方法,它决定了一个线程是否可以访问临界区资源.同时Object.wait() 和Object.notify()方法起到了线程等待和通知 ...
- 第4章 同步控制 Synchronization ----Interlocked Variables
同步机制的最简单类型是使用 interlocked 函数,对着标准的 32 位变量进行操作.这些函数并没有提供"等待"机能,它们只是保证对某个特定变量的存取操作是"一个一 ...
随机推荐
- linux小白成长之路7————Docker安装mysql
[内容指引] 从Docker检索mysql镜像: Mysql Docker镜像下载: 查看本地镜像列表: 设置Mysql的Docker镜像开机自动运行: 常用Docker指令及参数: 1.从Docke ...
- win10下NeuralStyle的tensorflow版实验
---恢复内容开始--- 首先配置win10下的tensorflow-gpu的运行环境,然后在github上将NeuralStyle拷贝下来,最后根据文档说明参数,运行文件,即可得到自己喜欢的styl ...
- SWFUpload文件上传详解
SWFUpload是一个flash和js相结合而成的文件上传插件,其功能非常强大. SWFUpload的特点: 1.用flash进行上传,页面无刷新,且可自定义Flash按钮的样式; 2.可以在浏览器 ...
- bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 ...
- BM V7000数据恢复成功案例;服务器数据恢复
IBM V7000存储是一款定位中端的存储设备,很多企业选择该服务器作为存储,最近北亚数据恢复中心接到一例V7000服务器数据恢复案例,下面将对本次数据恢复的过程和数据恢复方法进行归纳总结,希望对各位 ...
- IDEA之Jrebel插件激活
问题: 码农日常中,热部署是必不可少的,而jrebel插件很好的实现热部署功能. IDEA下载jrebel插件,可以免费试用15天,但之后就无法使用.因为Jrebel是收费的. 解决方法: 楼主也是百 ...
- Windows Server2012 故障转移集群之动态仲裁(Dynamic Quorum)
本篇文章主要介绍Windows2012的故障转移集群一个新功能“动态仲裁”,默认该功能是开启的: 动态仲裁能在当前群集投票出现分歧的情况下取消某些节点的投票权限,比如偶数个节点的群集环境.仲裁见证和动 ...
- DNS搜索过程
以www.renyi.com为例 一:客户端首先检查本地HOST文件,是否有对应的IP地址,如果有,客户端直接访问,如果没有,则执行下一步. 二:客户端查看本地缓存信息,是否有对应的IP地址,如果有, ...
- CSS基础:块级元素与盒模型
简介 在 HTML4.01 中,元素通常可以分为块级元素( “Block-level element” ) 和内联元素 ( "Inline-level element" ) 两大类 ...
- SpringMvc返回报文形式的控制-验证方法: JSON or HTML or XML
首先,请求通过accept请求头声明了支持的返回格式 然后,框架根据该请求头和代码实现(注解)选择了对应的MessageConverter处理返回! 一.验证过程 1.返回html 1.1.请求组装 ...