原子操作InterlockedExchange系列

//本内容只在多线程操作下具有意义

1  循环锁

实现循环锁: 
可以用InterlockedExChange来实现循环锁的功能,所谓循环锁,就是在线程1中如果要对变量进行操作,要先查看这个变量(或资源)有没有被其它线程用到,如果是,则一直循环,则到其它线程放弃对该变量(或资源)的控制。如果否,直接可以对该变量(或资源)进行操作。 
如: 
(使用srwlock也是可以实现的,可读性更强。不用其他互斥量,只为提升效率)
BOOL g_fResourceInUse = FALSE; 
void Func1() 

//Wait to access the resource. 等待资源 
while(InterlockedExchange(&g_fResourceInUse, TRUE) == TRUE) 
Sleep(0); 
//Access the resource. //获取资源 
...// 

//We no longer need to access the resource. 
InterlockedExchange(&g_fResourceInUse, FALSE); //释放资源 


其它线程如要使用资源也如上代码所示。 

OK,w h i l e循环是循环运行的(假使本线程是ThreadA),它将g _ f R e s o u r c e I n U s e中的值改为T R U E,并查看它的前一个值,以了解它是否是T R U E。如果是,则表示已经有线程(假使为ThreadB)使用了,它就要等待,直到ThreadB线程执行InterLockedExchange(&g_fResourceInUse, FALSE); 操作,则ThreadA它就可以退出while循环,然后获取资源,并且,它对g_fResourceInUse设置为TURE,其它线程(假使ThreadC)如要使用,则将如刚才ThreadA般等待。直到ThreadA的InterlockedExchange(&g_fResourceInUse, FALSE);执行完为止。 

2   原子操作数值

  volatile long g_sum=0;

InterlockedExchangeAdd(&g_sum,10);

返回原始值,g_sum值已经被修改

猜你喜欢

转载自blog.csdn.net/sichuanpb/article/details/81834945