• 临界区(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调用才能将事件设回无信号。
  • Interlocked Variable

    • 摘要

      • 如果Interlocked...() 函数被使用于所谓的spin-lock,那么他们只是一种同步机制。所谓spin-lock是一种busy loop,被预期在极短时间内执行,所以有最小的额外负担(overhead)。系统核心偶尔会使用他们。除此只外,Interlocked variable 主要用于引用计数。
    • 特点
      • 运行对4字节的数值有些基本的同步操作,不需动用critical section 或 Mutex 之类
      • 在SMP(Symmetric Multi-Processors)操作系统中亦可有效运作
    • 相关函数
      • 加一:InterlockedIncrement()
      • 减一:InterlockedDecrement()
      • 设值:InterlockedExchange


线程的同步控制(Synchronization)的更多相关文章

  1. 线程的同步控制synchronized和lock的对比和区别

     转载. https://blog.csdn.net/wu1226419614/article/details/73740899 我们在面试的时候,时常被问到如何保证线程同步已经对共享资源的多线程编程 ...

  2. 第4章 同步控制 Synchronization ----同步机制的摘要

    同步机制摘要Critical Section Critical section(临界区)用来实现"排他性占有".适用范围是单一进程的各线程之间.它是:  一个局部性对象,不是一个核 ...

  3. 第4章 同步控制 Synchronization ----事件(Event Objects)

    Win32 中最具弹性的同步机制就属 events 对象了.Event 对象是一种核心对象,它的唯一目的就是成为激发状态或未激发状态.这两种状态全由程序来控制,不会成为 Wait...() 函数的副作 ...

  4. 第4章 同步控制 Synchronization ----信号量(Semaphore)

    许多文件中都会提到 semaphores(信号量),因为在电脑科学中它是最具历史的同步机制.它可以让你陷入理论的泥淖之中,教授们则喜欢问你一些有关于信号量的疑难杂 症.你可能不容易找到一些关于 sem ...

  5. 第4章 同步控制 Synchronization ----互斥器(Mutexes)

    Win32 的 Mutex 用途和 critical section 非常类似,但是它牺牲速度以增加弹性.或许你已经猜到了,mutex 是 MUTual EXclusion 的缩写.一个时间内只能够有 ...

  6. 第4章 同步控制 Synchronization ----死锁(DeadLock)

    Jeffrey Richter 在他所主持的 Win32 Q&A 专栏(Microsoft Systems Journal,1996/07)中曾经提到过,Windows NT 和 Window ...

  7. 第4章 同步控制 Synchronization ----critical section 互斥区 ,临界区

    本章讨论 Win32 同步机制,并特别把重点放在多任务环境的效率上.撰写多线程程序的一个最具挑战性的问题就是:如何让一个线程和另一个线程合作.除非你让它们同心协力,否则必然会出现如第2章所说的&quo ...

  8. java线程的同步控制--重入锁ReentrantLock

    我们常用的synchronized关键字是一种最简单的线程同步控制方法,它决定了一个线程是否可以访问临界区资源.同时Object.wait() 和Object.notify()方法起到了线程等待和通知 ...

  9. 第4章 同步控制 Synchronization ----Interlocked Variables

    同步机制的最简单类型是使用 interlocked 函数,对着标准的 32 位变量进行操作.这些函数并没有提供"等待"机能,它们只是保证对某个特定变量的存取操作是"一个一 ...

随机推荐

  1. c++ --> extern "C" {}详解

    extern "C" {}详解 extern "C"的真实目的是实现类C和C++的混合编程.在C++源文件中的语句前面加上extern "C" ...

  2. python爬虫---抓取优酷的电影

    最近在学习爬虫,用的BeautifulSoup4这个库,设想是把优酷上面的电影的名字及链接爬到,然后存到一个文本文档中.比较简单的需求,第一次写爬虫.贴上代码供参考: # coding:utf-8 i ...

  3. 移动端H5地图矢量SHP网格切分打包方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 与离线瓦片方案一样,同样是为了解决移动端网速和流量问题,但是却 ...

  4. Java基础学习笔记二 Java基础语法

    注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /* 这是 * 一段注释, * 它跨越了多个行 */ public vo ...

  5. c语言第1次作业

    一.PTA实验作业 题目1:7-3 温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1 ...

  6. 《结对-HTML贪吃蛇游戏项目-测试过程》

    项目托管平台地址:https://gitee.com/zhaojianhuiAA/TanChiShe/blob/master/snake.html 项目成员:赵建辉.马壮. 测试: 1.界面:用jav ...

  7. 20162328蔡文琛week07

    学号 2016-2017-2 <程序设计与数据结构>第X周学习总结 教材学习内容总结 多态引用在不同的时候可以指向不同类型的对象. 多态引用在运行时才将方法调用用于它的定义绑定在一起. 引 ...

  8. 团队作业4——第一次项目冲刺(Alpha版本)11.16

    a. 提供当天站立式会议照片一张 举行站立式会议,讨论项目安排: 整理各自的任务汇报: 全分享遇到的困难一起讨论: 讨论接下来的计划: b. 每个人的工作 (有work item 的ID) 1.前两天 ...

  9. mongodb 集群分片

    分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量,这 ...

  10. Linux 下的权限改变与目录配置

    Linux 下的权限改变与目录配置 ./代表本目录的意思. (1):用户与用户组, 1:文件所有者,文件被某一用户所有 2:用户组:    对文件给与一个或者多个用户权限配置 3:其它人: (2):l ...