<五>基于CAS操作的atomic原子类型
2024-10-21 07:57:05
C++11多线程类库中提供了
include包含了很多原子类型
原子操作
若干汇编指令具有读-修改-写类型,也就是说它们访问存储器单元两次,第一次读原值,第二次写新值
假定运行在两个cpu上的两个内核控制路径试图通过执行非原子操作来同时读-修改-写同一个存储器。
首先两个cpu都试图读同一单元,然后使用不同的方式修改读取的内容之后将其写入该存储单元。
虽然最终两个写操作都会成功,但是全局结果是不对的,因为两个CPU写入同一内存单元,因此两个交错的读-修改-写操作成了一个单独的操作
避免由于"读-修改-写"指令引起的竞争条件的最容易的办法就是确保这样的操作在芯片级是原子的,任何一个这样的操作度必须以单个指令执行,中间不能中断,且避免其他的CPU访问同一存储器单元,这样很小的原子操作可以建立在其它更灵活机制的基础上以创建临界区。
窗口卖票案例中的 ticketCount++ ;ticketCount--不是线程安全的
我们原来是通过lock_guard(互斥锁) 来保证的
互斥锁是比较重的,对临界区代码做得事情稍微复杂,多. OK
对一些简单的情况,我们使用CAS来保证上面的 ++ --操作的原子特性就足够了,无锁操作.
C++11中的 automic头文件中包含了很多原子操作
volatile std::automic_bool isReadu=false;//volatile 不读缓冲中的值
volatile std::automic_int mycount=0;
void task(){
while(!isReady){
std::this_thread::yied();//线程出让当前的cpu时间片,等待下一次调度
}
for(int i=0;i<100;i++){
mycount++;
}
}
int main(){
list<std::thread> tlist;
for(int i=0;i<3;i++){
tlist.push_back(std::thread(task));
}
std::this_thread::sleep_for(std::chrono::sedonds(3));
isReady=true;
for(std::thread &t : tlist){
t.join();
}
}
最新文章
- C# Byte[] 转String 无损转换
- fullPage.js学习笔记
- 个推推送iOS版 常见问题详解
- (旧)子数涵数&#183;PS ——素描效果
- 使用Xpath对XML进行模糊查询
- 关于Cococs中的CCActionEase
- QT 获取文件MD5值
- js原生设计模式——10适配器模式之参数适配器
- Java并发基础——Thread
- [BZOJ]1143: [CTSC2008]祭祀river
- Go语言基础(一)
- MySQL设置global变量和session变量
- 工作笔记:/bin/bash^M: 坏的解释器: 没有那个文件或目录 问题解决
- Confluence 6 禁用或者重新启用一个任务
- 编译器处理警告、错误 #pragma GCC diagnostic ignored ";-Wunused";
- 【BZOJ1822】[JSOI2010]冷冻波(二分,网络流)
- 题解——HDU 4734 F(x) (数位DP)
- 二叉树求逆序对(伪AC 23333)
- springboot-27-整合mybatis,druid连接池
- android笔记 : Content provider内容提供器