本文目的
在muduo中,考虑到线程安全,自定义了原子操作类AtomicIntegerT,代码中全部采用了gcc的原子操作集合,有两种实现(引入c++11前的__sync和引入c++11后 的__atomic)。不过在c++11的std中也有了atomic实现(c++11之前没有atomic实现)。gcc的__sync和__atomic,atomic。这些听起来确实有些凌乱,在读源码前,我就先介绍一下c++原子操作的背景。
atomic背景
有多个线程都有可能对某个共享的数据进行操作(增删改),就会产生线程安全问题。虽然我们可以用锁去解决,但似乎有些浪费。而开销小的原子操作就可以解决这个问题。
- 原子操作:操作本身是不可分割的(Atomicity),一个线程对某个数据的操作何时对另外一个线程可见(Visibility),执行的顺序是否可以被重排(Ordering)。
- 对于原子操作的三个特点详解
gcc __sync
简而言之,就是c++11之前,标准库里没有原子操作函数,gcc提供的原子操作函数集合
type __sync_fetch_and_OP (type *ptr, type value, ...)
type __sync_OP_and_fetch (type *ptr, type value, ...)
bool__sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)
type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)
__sync_synchronize (...)
type __sync_lock_test_and_set (type *ptr, type value, ...)
void __sync_lock_release (typ