zoukankan      html  css  js  c++  java
  • 第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 所指之内容。

  • 相关阅读:
    atitit.TokenService v3 qb1 token服务模块的设计 新特性.docx
    Atitit attilax在自然语言处理领域的成果
    Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理
    Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结
    atitit。企业的价值观 员工第一 vs 客户第一.docx
    Atitit 实现java的linq 以及与stream api的比较
    Atitit dsl exer v3 qb3 新特性
    Atititi tesseract使用总结
    Atitit 修改密码的功能流程设计 attilax总结
    atitit.TokenService v3 qb1  token服务模块的设计 新特性.docx
  • 原文地址:https://www.cnblogs.com/azbane/p/7561297.html
Copyright © 2011-2022 走看看