当前位置:网站首页>原子操作 CAS
原子操作 CAS
2022-07-31 02:57:00 【JACKSONMHLN】
参考:
https://zhuanlan.zhihu.com/p/400817892
https://www.bilibili.com/read/cv10686883/
https://blog.csdn.net/www_dong/article/details/119920236
https://blog.csdn.net/niu91/article/details/116308436
https://blog.csdn.net/CringKong/article/details/79966161
1、原子操作
原子操作,不会被线程调度机制打断的操作。这个操作一旦开始,就一直运行到结束,中间不会有任何上下文切换。
典型的原子操作有(原子操作需要硬件支持)
Load / Store :读写内存
Test and Set:针对bool变量,如果为true则返回true,如果为false,则将变量置为true并返回false。
Clear:将bool变量设为false。
Exchange:将指定位置的值设置为传入值,并返回其旧值。
Compare and Swap:将指定位置的值与期望值比较,如果相等则赋值为新值,如果不等则将期望值设置为自身。返回是否设置成功。
Fetch And 加减乘除系列:对指定位置的值使用传入参数执行加减乘除,并返回旧值。
2、竞态条件(Race Conditon)
int i = 0;
i++;
mov eax,dword ptr [i] // 将i加载到eax寄存器
add eax,1 // eax中的值加一
mov dword ptr [i],eax // 将eax中的值赋值到i的地址
汇编层面有三步操作:读-修改-写。线程1修改完还未写到内存中去,线程2得到CPU开始执行,修改的会是线程1未写到内存中的值,存在线程安全问题。
4、线程安全
解决线程安全通常有以下方法:
1、使用原子操作。
2、加锁:悲观锁或者乐观锁(无锁)
1、atomic_int num; num++;
在msvc中,C++11 提出的 atomic_int 类型,在 num++ 操作时,底层调用windows提供的原子自增函数_InterlockedIncrement 。
2、悲观锁
mutex 就是一种悲观锁的使用。假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
3、乐观锁
假设不会发生并发冲突,每次不加锁而是假设没有冲突而去完成某项操作,只在提交操作时检查是否违反数据完整性。
CAS (Compare And Swap)操作是一条CPU的原子指令,所以不会有线程安全问题。
CAS(addr,old,new)
解释:将addr存放的只与old比较,如果等于old,则将new赋值给addr。
C++ 可以实现如下:
bool compare_and_swap(int* pAddr, int nExpected, int nNew) {
if (*pAddr == nExpected) {
*pAddr = nNew;
return true;
}
else
return false;
}
不同编译器 底层实现不一样,但算法思想一样。
GCC的CAS,GCC4.1+版本中支持CAS的原子操作。
1)bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)
2)type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)
C++11中的CAS,C++11中的STL中的atomic类的函数可以让你跨平台。
template< class T > bool atomic_compare_exchange_weak( std::atomic* obj,T* expected, T desired );
template< class T > bool atomic_compare_exchange_weak( volatile std::atomic* obj,T* expected, T desired );
Windows的CAS
InterlockedCompareExchange ( __inoutLONGvolatile *Target,
__inLONGExchange,
__inLONGComperand);
CAS 存在的问题: ABA。
解决方法: Double CAS,即可以加上版本号。
像状态寄存器、映射到内存地址上的 I/O 操作、涉及硬件操作的变量需要加volatile,因为对它们的每一次操作都有其意义,
而并发时,多线程多任务环境下各任务间共享的标志,其实更应该用原子量和内存序,或者直接加互斥锁,以确保共享区操作的原子性和顺序性。
所以其实volatile和atomic是应用于不同场景的,甚至可以叠加使用。比如:
volatile std::atomic<int> value;
这个式子表示对value的操作都是原子性的,
边栏推荐
- Discourse Custom Header Links
- 【Bank Series Phase 1】People's Bank of China
- Live Preview | KDD2022 Doctoral Dissertation Award Champion and Runner-up Dialogue
- SQL注入 Less46(order by后的注入+rand()布尔盲注)
- BAT can't sell "Medical Cloud": Hospitals flee, mountains stand, and there are rules
- C primer plus学习笔记 —— 8、结构体
- 拒绝加班,程序员开发的效率工具集
- The application of AI in the whole process of medical imaging equipment
- The principle of complete replication of virtual machines (cloud computing)
- CentOS7下mysql5.7.37的安装【完美方案】
猜你喜欢
Why is String immutable?
Crypto Firms Offer Offer To Theft Hackers: Keep A Little, Give The Rest
4、敏感词过滤(前缀树)
[Android] Room - Alternative to SQLite
Linux下redis7的安装,启动与停止
JS function this context runtime syntax parentheses array IIFE timer delay self.backup context call apply
YOLOV5 study notes (2) - environment installation + operation + training
华为分布式存储FusionStorage知识点总结【面试篇】
The whole process scheduling, MySQL and Sqoop
图解lower_bound&upper_bound
随机推荐
学习DAVID数据库(1)
【C语言基础】解决C语言error: expected ‘;‘, ‘,‘ or ‘)‘ before ‘&‘ token
JetPack component Databinding
STM32CUBEMX开发GD32F303(11)----ADC在DMA模式下扫描多个通道
SQL injection Less46 (injection after order by + rand() Boolean blind injection)
10 权限介绍
mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)
JS function this context runtime syntax parentheses array IIFE timer delay self.backup context call apply
Draw Your Cards
Project (5) - Small target detection tph-yolov5
Moxa NPort 设备缺陷可能使关键基础设施遭受破坏性攻击
Mathematics to solve the problem - circular linked list
MPPT solar charge controller data collection - through the gateway acquisition capacity battery SOC battery voltage, wi-fi
6. Display comments and replies
How to build a private yum source
TCP/IP四层模型
工程(五)——小目标检测tph-yolov5
The application of AI in the whole process of medical imaging equipment
Software accumulation -- Screenshot software ScreenToGif
Maximum area of solar panel od js