聊聊原子操作那些事
某厂面试归来,发现自己落伍了!>>> 原子操作,线程间交互数据最细粒度的同步操作,它可以保证线程间读写某个数值的原子性。 由于不需要加重量级的互斥锁进行同步,因此非常轻量,而且也不需要在内核间来回切换调度,效率是非常高的。。 那如何使用原子操作了,各个平台下都有相关api提供了支持,并且向gcc、clang这些编译器,也提供了编译器级的__builtin接口进行支持 windows的Interlockedxxx和Interlockedxxx64系列api macosx的OSAtomicXXX系列api gcc的 __sync_val_compare_and_swap 和 __sync_val_compare_and_swap_8 等__builtin接口 x86和x86_64架构的 lock 汇编指令 tbox的跨平台原子接口 tbox接口使用 先拿tbox的 tb_atomic_fetch_and_add 接口为例,顾名思义,这个api会先读取原有数值,然后在其基础上加上一个数值: // 相当于原子进行:b = *a++; tb_atomic_t a = 0; tb_long_t b = tb_atomic_fetch_and_add(&a, 1); 如果需要先进行add计算,再返回结果可以用: // 相当于原子进行:b = ++*a; tb_atomic_t a = 0; tb