C/C++领域的原子操作总结

   C/C++开发中经常要用到多线程并发操作,为了实现常用数值类型数据在多个线程中共享,常用的方法有两种,一种是加锁,另一种是使用原子操作,两者相比原子操作执行效率更高。

目录

1. gcc提供原子操作

2.C++11中的原子操作

3.VC++中的原子操作


1. gcc提供原子操作

    gcc从4.1.2以后提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。
(1)先返回再++
type __sync_fetch_and_add (type  * ptr, type value, ...)
(2)先返回再--
type __sync_fetch_and_sub (type  * ptr, type value, ...)
(3)先返回再或
type __sync_fetch_and_or (type  * ptr, type value, ...)
(4)先返回再与
type __sync_fetch_and_and (type  * ptr, type value, ...)
(5)先返回再异或
type __sync_fetch_and_xor (type  * ptr, type value, ...)
(6)先返回再与非
type __sync_fetch_and_nand (type  * ptr, type value, ...)

(1)先++再返回
type __sync_add_and_fetch (type  * ptr, type value, ...)
(2)先--再返回
type __sync_sub_and_fetch (type  * ptr, type value, ...)
(3)先或再返回
type __sync_or_and_fetch (type  * ptr, type value, ...)
(4)先与再返回
type __sync_and_and_fetch (type  * ptr, type value, ...)
(5)先异或再返回
type __sync_xor_and_fetch (type  * ptr, type value, ...)
(6)先与非再返回
type __sync_nand_and_fetch (type  * ptr, type value, ...)


2.C++11中的原子操作

标准C++提供的原子操作
std::atomic
(1) -- ++操作
(2)store(写操作)
(3)load(读操作)
(4)exchange(交换数据)
(5)compare_exchange_weak (CAS)
(6)compare_exchange_strong (加强版的CAS,性能略差)


3.VC++中的原子操作

VC++常用原子操作API
一. 增减操作
(1) LONG InterlockedIncrement(IN OUT LONG volatile *lpAddend);
lpAddend为长整型变量的地址,返回值为+1后的值。这个函数的主要作用是原子性自增(相当于++操作)。
(2) LONG InterlockedDecrement(IN OUT LONG volatile *lpAddend);
lpAddend为长整型变量的地址,返回值为-1后的值。这个函数的主要作用是原子性自减(相当于--操作)。
(3) LONG InterlockedExchangeAdd( LPLONG Addend, LONG Increment );
Addend为长整型变量的地址,Increment为想要在Addend指向的长整型变量上增加的数值(可以是负数)。这个函数的主要作用是保证这个加操作为一个原子访问。
二. 交换操作
(1) LONG InterlockedExchange( LPLONG Target, LONG Value );
(2) PVOID InterlockedExchangePointer( PVOID *Target, PVOID Value );
用第二个参数的值取代第一个参数指向的值。函数返回值为原始值。
三. 比较交换操作
(1) LONG InterlockedCompareExchange(
LPLONG Destination, LONG Exchange, LONG Comperand );
(2) PVOID InterlockedCompareExchangePointer(
PVOID *Destination, PVOID Exchange, PVOID Comperand );
如果第三个参数与第一个参数指向的值相同,那么用第二个参数取代第一个参数指向的值。函数返回值为原始值。

猜你喜欢

转载自blog.csdn.net/hsy12342611/article/details/128466811