现在的位置: 首页 > 综合 > 正文

API – InterlockedCompareExchange用法

2013年05月04日 ⁄ 综合 ⁄ 共 742字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.