在《多线程编程之数据访问互斥》的报道中简单介绍了原子链,现在详细说明原子链的概念和用途。
(1)简单数据操作
如果要在多线程环境中对变量执行简单的数学或逻辑运算,则必须使用原子锁定操作。 因为使用线程独占方法(如临界空间、独占量等)会涉及许多操作系统调用和函数调用,而且效率不如原子操作那么高。 例如,有这样一个例子:
未指定的int count=0; intdata_process (
{if(/*conditions )/) }{
电子商务(cs; 出局;
leavecriticalsection(cs;
}
}
这里只有简单的数学操作。 可以应用操作系统提供的原子操作来代替,效率相当高。
未指定的int count=0; intdata_process (
{if(/*conditions )/) }{
联锁增量(计数;
}
}
)2)代码段中的互斥
还是以临界区域为例,例如在代码段中应用了以下临界区域:
voiddata_process (
{
电子商务(cs;
do_something (;
leavecriticalsection(cs;
}
这里也可以利用原子链代替临界区域,实现方法如下。
未指定锁定=0; voiddata_process (
{ while (1==交互式加密交换(lock,1,0 );
do_something (; 锁定=0;
}
InterLockedCompareExchange方法的含义是将第一个参数的值与第三个参数的值进行比较,如果相等则交换第二个参数的值,如果不相等则不操作。 返回值是第一个参数的初始值,此函数执行的操作是原子操作,适用于所有CPU,而不会被多线程中断。
上述代码意味着不断监视lock的值。 如果lock的值为0,则InterLockedCompareExchange将其更改为1,执行do_something (,最后将lock恢复为0。 当然,如果此时lock为1,则此while循环会不断运行(“忙等”)。
其实说到这里,你就会发现这里有问题。 如果另一个线程将lock设为1,执行需要很长时间,这里不是会发疯吗? 是的。 此原子锁定方法适用于对线程进行短时间操作的独占情况,而不是对所有系统的独占锁定调用的替代方法。 临界区在这个时候将显示出更大的优势。