同步机制的最简单类型是使用 interlocked 函数,对着标准的 32 位变量进行操作。这些函数并没有提供“等待”机能,它们只是保证对某个特定变量的存取操作是“一个一个接顺序来”。稍后我会把这些 interlocked 函数展示出来,因为唯有你自己亲身比较它们和其他同步机制的差异,才能够了解它们的用途。
    考虑一下,如果你需要维护一个 32 位计数器的“排他性存取”性质,你该怎么做。你可能会想产生一个 critical section 或一个 mutex,拥有它,然后进行你的操作,然后再释放拥有权。一个 32 位变量的存取操作只需要 2~3 个机器指令,因此上述的准备动作实在是太多了些,几乎呈现两个 order 的倍数。
    类似的 32 位计数器发生在所谓的引用计数(reference counting)身上,例如系统核心对于核心对象之 handle 的处理。基本上当一个核心对象的引用计数降为 0 时,这个对象就应该被摧毁。你可以“要么降低其引用计数值” , “ 要么判断它是否等于 0 ” , 但是没办法两者并行。InterlockedDecrement() 可以双效合一,它先将计数器内容减 1,再将其值与 0 做比较,并且传回比较结果。
    所谓的 interlocked 函数,共有两个:
         InterlockedIncrement()
         InterlockedDecrement()
    这两个函数都只能够和 0 做比较,不能和任何其他数值比较。
    LONG InterlockedIncrement(
        LPLONG lpTarget
    );
    LONG InterlockedDecrement(
        LPLONG lpTarget
    );
参数
    lpTarget     32 位变量的地址。这个变量内容将被递增或递减,结果将与 0 作比较。这个地址必须指向 long word。
返回值
    变量值经过运算(加 1 或减 1)后,如果等于 0,传回 0;如果大于 0,传回一个正值;如果小于 0,传回一个负值。
    Interlocked...() 函数的传回值代表计数器和 0 的比较结果。这一点对于实现我们曾经提过的所谓“引用计数”(reference counting)非常重要,因为我们必须知道“引用计数”何时到达 0。如果没有这个比较,问题就回到了原点,你必须在增减操作之前先锁定该计数器,以使增减操作成为一个“不可切割”的操作。
    对专家而言… Windows 3.x 的确支持抢先式多任务,但程序员却不可得之。由于DOS 程序毫无共享观念,多任务是让它们不得擅专整部机器的唯一方法。而所有Windows 程序则被“放在一起,视为单一的DOS 程序”。所以Windows 3.x对DOS 程序的确是抢先式多任务,但对于Windows 程序则不是。
    如果你使用新版 OLE(搭配 apartment model 或 free threading model 的那种),你应该使用 Interlocked...() 函数来维护你的对象的引用计数。请在AddRef() 之中调用 InterlockedIncrement() 并且在 Release() 之中调用InterlockedDecrement()。
    InterlockedExchange() 可以设定一个新值并传回旧值。就像Increment/Decrement 函数一样,它提供了一个在多线程环境下的安全做法,用以完成一个很基础的运算操作。
    LONG InterlockedExchange(
        LPLONG lpTarget,
        LONG lValue
    );
参数
    lpTarget 32 位变量的地址。这个指针必须指向 long word。    lValue 用以取代 lpTarget 所指内容之新值。
返回值
    传回先前由 lpTarget 所指之内容。

第4章 同步控制 Synchronization ----Interlocked Variables的更多相关文章

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

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

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

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

  3. 第4章 同步控制 Synchronization ---哲学家进餐问题(The Dining Philosophers)

    哲学家进餐问题是这样子的:好几位哲学家围绕着餐桌坐,每一位哲学家要么思考,要么等待,要么就吃饭.为了吃饭,哲学家必须拿起两支筷子(分放于左右两端).不幸的是,筷子的数量和哲学家相等,所以每支筷子必须由 ...

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

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

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

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

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

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

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

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

  8. 【翻译十七】java-并发之高性能对象

    High Level Concurrency Objects So far, this lesson has focused on the low-level APIs that have been ...

  9. 【转】O'Reilly Java系列书籍建议阅读顺序(转自蔡学庸)

    Learning Java the O'Reilly's Way (Part I) Java 技术可以说是越来越重要了,不但可以用在计算机上,甚至连电视等家电用品,行动电话.个人数字助理(PDA)等电 ...

随机推荐

  1. 基于SSM框架的文件上传

    我整理了一下,这个办法在Servlet上应该也用得上.其实文件上传主要的问题是在于存储路径的拼接. 这里我是把东西存在Web项目的WebContent目录下的 下面贴一些代码 目标应该是这样一个格式 ...

  2. 如何编写更好的SQL查询:终极指南-第二部分

    上一篇文章中,我们学习了 SQL 查询是如何执行的以及在编写 SQL 查询语句时需要注意的地方. 下面,我进一步学习查询方法以及查询优化. 基于集合和程序的方法进行查询 反向模型中隐含的事实是,建立查 ...

  3. HDU 6149 Valley Numer II 状压DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149 题意:中文题目 解法:状压DP,dp[i][j]代表前i个低点,当前高点状态为j的方案数,然后枚 ...

  4. ASP.Net Core WebApi几种版本控制对比

    版本控制的好处: (1)助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或 ...

  5. 项目管理svn

    https://nchc.dl.sourceforge.net/project/tortoisesvn/1.9.6/Application/TortoiseSVN-1.9.6.27867-x64-sv ...

  6. spring整合mybatis错误:HTTP Status 404 - xxx-xxx....

    运行环境:jdk1.7.0_17 + tomcat 7 + spring 3.2.0 +mybatis 3.2.7+ eclipse,访问路径:http://localhost:8085/Spring ...

  7. 【C# in depth 第三版】温故而知新(1)

    声明 本文欢迎转载,原文地址:http://www.cnblogs.com/DjlNet/p/7192354.html 前言 关于这本书(<深入理解C# 第三版>)的详细情况以及好坏,自行 ...

  8. javascript中用setAttribute给元素添加colspan属性无效

    先附上代码 var tr=document.createElement('TR'); var td=document.createElement('TD'); td.setAttribute('col ...

  9. vim文本基础

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...

  10. 简单的独享smb

    1.是这样的,因为办公区域有一个千兆的交换机,但是我的台式机硬盘有点小,500G的,就把一个旧的台式网卡换成了千兆的,装了个CentOS6.5,最小化的,装了个samba,就开始用了: 2.由于是自己 ...