5-mudo-base-Atomic

 

1 类说明

一个原子(模板)类AtomicIntegerT,关于这个类的操作都是原子的

 

2 继承

  • noncopyable

    • 表明这个类不可以拷贝复制

 

2 成员变量说明

  • value_

    • volatile T类型的。当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据,而不是从寄存器中获取数据(备份)。而且读取的数据立刻被保存。

 

# 3 成员函数说明

1 non-static

  • 构造函数:

    • 初始化value_为0

  • get

    • __sync_val_compare_and_swap(&value_, 0, 0)

    • 使用gcc提供的原子操作函数__sync_val_compare_and_swap(type *ptr, type oldval, type newval),原子比较函数

    • 如果ptr == oldval,就将newval写入ptr,返回改变前的值

  • getAndAdd

    • __sync_fetch_and_add(&value_, x)

    • __sync_fetch_and_add(type *ptr, type value) 原子自增操作,先fetch,然后自加,返回的是自加以前的值

  • addAndGet

    • 调用getAndAdd加x

  • incrementAndGet

    • 调用addAndGet加1

  • decrementAndGet

    • 调用addAndGet加-1

  • add

    • 调用getAndAdd加x

  • increment

    • 调用incrementAndGet

  • decrement

    • 调用decrementAndGet

  • getAndSet

    • __sync_lock_test_and_set(&value_, newValue)

    • __sync_lock_test_and_set(type ptr, type value) 原子赋值函数, 将ptr设为value并返回*ptr操作之前的值。

 

以上gcc提供的原子操作是C++11才支持,具体可以参考

__sync_fetch_and_add系列 - jiu~ - 博客园 (cnblogs.com)

 

4 测试

  • 用assert将各种get和set函数都测一次

 

5 其他

关于原子操作的扩展:无锁队列的实现 | 酷 壳 - CoolShell

posted @ 2023-05-01 12:45  DavidJIAN  阅读(10)  评论(0)    收藏  举报