Win32多线程之Interlocked Variables

来源:互联网 发布:成人频道直播软件 编辑:程序博客网 时间:2024/06/01 09:57

   同步机制的最简单类型就是使用interlocked 函数,对着标准的32位变量进行操作。这些函数并没有提供“等待”机能,它们只是保证对某个特定变量的存取操作时“一个一个按顺序来”。

  考虑一下,如果你需要维护一个32位计数器的“排他性 存取”性质,你该怎么做?你可能会产生一个critical section或一个mutex,拥有它,然后进行你的操作,然后再释放拥有权,一个32位变量的存取操作只需要2-3个机器指令,因此上述的准备实在是太多了些,几乎呈现两个order的倍数。

  类似的32位计数器发生在所谓的引用计数(reference counting )身上,例如系统核心对于核心对象的handle的处理,基本上当一个核心对象的引用计数为0时,这个对象就应该被摧毁,你可以“要么降低其引用计数值”,“要么判断它是否等于0”,但是没办法两者并行。

InterlockedDecrement()可以双效合一,它先将计数器内容减1,再将其值与0做比较,并且传回比较结果。

所谓的interlocked函数,共有两个:

1) InterlockedIncrement()

2)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)非常重要,因为我们必须知道“引用计数”(reference counting)非常重要,因为我们必须知道“引用计数”何时到达0,如果没有这个比较,问题就回到了原点。你必须在增减操作之前先锁定该计数器,以便增减操作成为一个“不可切割”的操作。

  InterlockedExchange()可以设定一个新值,并传回旧值。就像InterlockedIncrement()和InterlockedDecrement()一样。他提供了一个在多线程环境下的安全做法,用以完成一个很基础的运算操作。

LONG  InterlockedExchange(

   LPLONG   lpTarget,

   LONG    lValue

);


参数


lpTarget  32位变量的地址,这个指针必须指向long word

lValue      用以取代lpTarget 所指内容的新值。


返回值

     传回先前由lpTarget所指的内存。