第4章 同步控制 Synchronization ----Interlocked Variables
同步机制的最简单类型是使用 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的更多相关文章
- 第4章 同步控制 Synchronization ----同步机制的摘要
同步机制摘要Critical Section Critical section(临界区)用来实现"排他性占有".适用范围是单一进程的各线程之间.它是: 一个局部性对象,不是一个核 ...
- 第4章 同步控制 Synchronization ----事件(Event Objects)
Win32 中最具弹性的同步机制就属 events 对象了.Event 对象是一种核心对象,它的唯一目的就是成为激发状态或未激发状态.这两种状态全由程序来控制,不会成为 Wait...() 函数的副作 ...
- 第4章 同步控制 Synchronization ---哲学家进餐问题(The Dining Philosophers)
哲学家进餐问题是这样子的:好几位哲学家围绕着餐桌坐,每一位哲学家要么思考,要么等待,要么就吃饭.为了吃饭,哲学家必须拿起两支筷子(分放于左右两端).不幸的是,筷子的数量和哲学家相等,所以每支筷子必须由 ...
- 第4章 同步控制 Synchronization ----critical section 互斥区 ,临界区
本章讨论 Win32 同步机制,并特别把重点放在多任务环境的效率上.撰写多线程程序的一个最具挑战性的问题就是:如何让一个线程和另一个线程合作.除非你让它们同心协力,否则必然会出现如第2章所说的&quo ...
- 第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 ...
- 【翻译十七】java-并发之高性能对象
High Level Concurrency Objects So far, this lesson has focused on the low-level APIs that have been ...
- 【转】O'Reilly Java系列书籍建议阅读顺序(转自蔡学庸)
Learning Java the O'Reilly's Way (Part I) Java 技术可以说是越来越重要了,不但可以用在计算机上,甚至连电视等家电用品,行动电话.个人数字助理(PDA)等电 ...
随机推荐
- Servlet和Filter的url匹配以及url-pattern详解 及 filter 循环问题的解决
Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜.估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,ser ...
- spring boot / cloud (十二) 异常统一处理进阶
spring boot / cloud (十二) 异常统一处理进阶 前言 在spring boot / cloud (二) 规范响应格式以及统一异常处理这篇博客中已经提到了使用@ExceptionHa ...
- DOS命令运行java文件,批量引用jar包
进入class文件目录 cd:\workspace\workspace_goodsownersystem\workspace_goodsownersystem\goodsownersystem\tar ...
- Java并发之线程
在前面我们介绍的一些内容中,我们的程序都是一条执行流,一步一步的执行.但其实这种程序对我们计算机的资源的使用上是低效的.例如:我们有一个用于计算的程序,主程序计算数据,在计算的过程中每得到一个结果就需 ...
- Ubuntu下安装NVIDIA显卡驱动的教训
今天在ubuntu16.04版本下安装了NVIDIA的显卡驱动,真的是一波十六折: 首先是在英伟达的官网上查找你自己电脑的显卡型号然后下载相应的驱动. 网址:http://www.nvidia.cn/ ...
- oop6 栈 界面
作业要求 本次作业要求实现核心算法,请将表达式生成的代码及相关的检验.计算表达式结果的代码贴在博客中,并对代码进行必要的解释. 发表一篇博客,博客内容为:提供本次作业的github链接,本次程序运行的 ...
- 201521123083 《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 1.2 可选:使用常规方法总结其他上课内容. protec ...
- java记事本1.2版
功能:实现了新建,打开,保存,退出,复制,剪切,粘贴等功能 效果图:
- 【Alpha】Daily Scrum Meeting——Day4
站立式会议照片 1.本次会议为第四次Meeting会议: 2.本次会议在大课间09:40,在图书馆一楼楼道召开,本次会议为30分钟讨论昨天的任务完成情况以及接下来的任务安排. 燃尽图 每个人的工作分配 ...
- Swing-选项卡面板JTabbedPane-入门
注:非原创,内容源自<Swing 的选项卡面板>,笔者做了少量修改. 选项卡面板是一个很常用的Swing组件,在window下,右击我的电脑,查看属性,就是一个典型的选修卡面板.当然还有最 ...