同步机制的最简单类型是使用 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. Html5笔记之小结

    随着Android,IOS手机,平板等各种App的不断扩增,加上对过去传统HTML的的各种不完善,例如视频依靠Flash,对手机和桌面的不兼容等等.HTML5来了,来解决这些问题了. Html5是W3 ...

  2. 为什么Java字符串是不可变对象?

    转自 http://developer.51cto.com/art/201503/468905.htm 本文主要来介绍一下Java中的不可变对象,以及Java中String类的不可变性,那么为什么Ja ...

  3. JRE 和 JDK 的区别

    JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库.是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的.   JDK顾名思义是java开发 ...

  4. 深入理解JVM(八)——java堆分析

    上一节介绍了针对JVM的监控工具,包括JPS可以查看当前所有的java进程,jstack查看线程栈可以帮助你分析是否有死锁等情况,jmap可以导出java堆文件在MAT工具上进行分析等等.这些工具都非 ...

  5. 设置为互斥按钮的一组Radio按钮的用法

    设置为互斥按钮的一组Radio,只需要将第一个Radio的Group属性设置为True,并为之映射变量(DDX),其余radio的Group属性设置为False,不需要映射变量. 否则会出现不是互斥按 ...

  6. CentOS7中将home迁移到/下的命令 CentOS7中将home迁移到/下的命令

    # mkdir -p /backup # cp -r /home/* /backup # umount /home #  df -hl # fdisk -l # lvremove /dev/cento ...

  7. sudoku--SE第二次作业

    git传送门 编译环境: windows10.vs2017 所用语言: c++ 首先作为一个晚上闭眼的玩家,我先来讲一下我的心路历程: 最开始接到作业的时候心里是拒绝的,刚出了一趟小远门就这样,就很难 ...

  8. 201521123032 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 在课堂上在老师 ...

  9. 201521123011 《Java程序设计》第1周学习总结

    1. 本章学习总结 通过这章的学习让我初步认识了Java,认识到了java和之前c语言的异同点. 对java是面向对象的这句话有了一定了解 认识了jdk,jre,jvm的区别. 2.书面作业 1.为什 ...

  10. Ubuntu下PHP MySQL环境搭建-upcoming-ChinaUnix博客

    编程语言选择php5 , web服务器选择Apache2 ,后台数据库选择MySQL首先安装编译工具, 打开终端 sudo apt-get install build-essential autoco ...