zoukankan      html  css  js  c++  java
  • API InterlockedCompareExchange用法

    技术交流,DH讲解.

    今天在看VCL中TEncoding类的时候看见这个API函数:

    function InterlockedCompareExchangePointer(var Destination: Pointer; Exchange: Pointer; Comperand: Pointer): Pointer;
    begin
      Result := Pointer(InterlockedCompareExchange(Integer(Destination), Integer(Exchange), Integer(Comperand)));
    end;

    我们从名字上面可以看到有3个地方Lock,Compare,Exchange.因为不懂,所以我去找了下MSDN,看下msdn原文:
    Performs an atomic compare-and-exchange operation on the specified values.
    对就这么一句话,那么我们来看看这个函数的作用吧.

    if a=b then
       a:=c;

    这段代码要是在一个多线程里面,而a又是多个线程共享的话,如果:
    线程1正在判断a=b
    线程2却在赋值a:=c
    这里又不算违规,我们要避免这样情况就可以用这个函数过InterlockedCompareExchange可判断多线程共享的int型数据是否等于预定值,并对其进行赋值。

    作用:
    InterlockedCompareExchange是把目标操作数(第1参数所指向的内存中的数)与一个值(第3参数)比较,如果相等,则用另一个值(第2参数)与目标操作数(第1参数所指向的内存中的数)交换;InterlockedExchange是不比较直接交换。整个操作过程是锁定内存的,其它处理器不会同时访问内存,从而实现多处理器环境下的线程互斥。

  • 相关阅读:
    nodejs中exports与module.exports的区别
    Webpack--自学笔记
    cookie、sessionStorage、localStorage 详解
    JavaScript中URL的解码和编码
    javascript中怎么判断对象{}为空
    关于获取、设置css样式封装的函数入门版
    多行文本溢出显示省略号(…)
    前端优化的问题
    volatile
    MySQL(六) decimal数据默认处理
  • 原文地址:https://www.cnblogs.com/huangjacky/p/1646611.html
Copyright © 2011-2022 走看看