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是不比较直接交换。整个操作过程是锁定内存的,其它处理器不会同时访问内存,从而实现多处理器环境下的线程互斥。

  • 相关阅读:
    hiho#1445 重复旋律5 求子串数量 后缀自动机
    SPOJ LCS2 后缀自动机
    SPOJ-LCS 后缀自动机
    bzoj 3261 最大异或和 可持久化字典树(01树)
    【洛谷1297】单选错位
    【HAOI2008】木棍分割
    【SDOI2016】排列计数
    【HAOI2008】下落的圆盘
    【HAOI2008】硬币购物
    【洛谷5520】青原樱
  • 原文地址:https://www.cnblogs.com/huangjacky/p/1646611.html
Copyright © 2011-2022 走看看