原子操作
2008-8-7 version 1.0
原子操作作用于long等简单类型的简单算术操作;
1 Windows API
WinAPI提供了丰富的原子操作函数,这些函数可以多线程程序或多进程访问的共享内存:
l InterlockedIncrement与InterlockedIncrement64;
l InterlockedDecrement与InterlockedDecrement64;
l InterlockedExchange与InterlockedExchange64,用于赋值;
l InterlockedExchangePointer,用于指针赋值;
l InterlockedExchangeAdd与InterlockedExchangeAdd64,相当C的“+=”;
l InterlockedCompareExchange与InterlockedCompareExchange64,如果Destination等于Comperand,就将Destination赋值为Exchange;
l InterlockedCompareExchangePointer,用于指针;
2 POSIX
没有提供原子操作功能;
3 ACE
ACE5.5中提供了4个原子操作模板类,提供简单的加减和比较操作:
l ACE_Atomic_Op_Ex< ACE_LOCK, TYPE>,使用锁实现线程安全性;
l ACE_Atomic_Op< ACE_LOCK, TYPE>,使用上面的ACE_Atomic_Op_Ex实现;
l ACE_Atomic_Op<ACE_Thread_Mutex, long>,Windows下使用InterlockedIncrement()等函数,否则使用自定义函数single_cpu_increment、single_cpu_decrement、single_cpu_exchange、single_cpu_exchange_add、multi_cpu_increment、multi_cpu_decrement、multi_cpu_exchange、multi_cpu_exchange_add——这些函数在条件“#if defined (__GNUC__) && (defined (ACE_HAS_PENTIUM) || defined (__amd64__))”成立时,使用一些汇编代码实现;
l ACE_Atomic_Op<ACE_Thread_Mutex, unsigned long>,与上面类似;
前面两个类的比较操作加锁实现;后两类比较操作没有进行保护——因为更改的原子性,这没有问题;