当前位置:首页 > 科技  > 软件

C++ 里 ++i 是原子操作吗?

来源: 责编: 时间:2023-09-20 21:55:02 405观看
导读1.什么是原子操作在多线程环境下,原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。原子操作可以确保某些特定操作在多线程条件下,

1.什么是原子操作

在多线程环境下,原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。3aM28资讯网——每日最新资讯28at.com

原子操作可以确保某些特定操作在多线程条件下,不会由于线程切换而导致数据污染。比如,对一个变量的读/写操作,就是一个常见的需要原子化的场景。如果把这样的读/写操作设计成原子操作,就可以避免多线程竞争导致的数据不一致问题。3aM28资讯网——每日最新资讯28at.com

3aM28资讯网——每日最新资讯28at.com

2.++i 是否原子操作

在 C++ 中,对一个变量的自增(++)操作看似很简单,理论上它包含:3aM28资讯网——每日最新资讯28at.com

  • 读变量原值
  • 对原值加 1
  • 将结果写回变量

例如:3aM28资讯网——每日最新资讯28at.com

int i = 0; ++i;

但是在多线程环境下,这三个步骤如果被打断,可能导致如下结果:3aM28资讯网——每日最新资讯28at.com

  • 线程1 读到i=0
  • 线程2也读到i=0
  • 线程1对i加1并写入,现在i=1
  • 线程2对i加1并写入,这时覆盖了线程1的写入,又使得i=1

很明显,实际的运行次数是2次,但最终结果是i=1,这就是数据污染的例子。3aM28资讯网——每日最新资讯28at.com

为了避免上述情况,C++编译器在编译过程中,会自动将一些看似简单的操作(例如自增操作)转换为原子指令,从而保证其原子性。3aM28资讯网——每日最新资讯28at.com

这种特性与具体的编译器实现相关,比如主流的GNU编译器和MSVC编译器都对自增操作进行了优化,确保其原子执行。3aM28资讯网——每日最新资讯28at.com

所以可以认为,在绝大多数C++实现中,++i这个自增操作是原子的。但是仍有一些例外情况需要注意,比如在嵌入式平台上可能需要开发者显式指定操作的原子性。3aM28资讯网——每日最新资讯28at.com

3. 如何保证操作的原子性

在不能依赖编译器优化的情况下,C++11提供了一些方法可以保证操作的原子性:3aM28资讯网——每日最新资讯28at.com

(1) atomic类型:提供了一些原子类型,对其操作天然原子3aM28资讯网——每日最新资讯28at.com

int i = 0; ++i;

(2) mutex:使用mutex可以在临界区内执行一个原子块3aM28资讯网——每日最新资讯28at.com

std::mutex m;m.lock();// critical sectioncnt++; m.unlock();

(3) lock-free编程:通过CAS(compare-and-swap)等原子指令实现非阻塞同步3aM28资讯网——每日最新资讯28at.com

atomic_int val;int expect = val.load();while(!val.compare_exchange_weak(expect, expect + 1)) {  expect = val.load(); } atomic_int val;int expect = val.load();while(!val.compare_exchange_weak(expect, expect + 1)) {  expect = val.load(); }

4. 总结

综上所述,在大多数普通的桌面程序和服务端程序中,++i这样的自增操作可以看作是原子的,编译器会做出优化。但是对于嵌入式开发等要求原子操作显式控制的场景,C++11提供了一些新的原子类型和同步原语来保证操作的原子执行。3aM28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-10591-0.htmlC++ 里 ++i 是原子操作吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python小技巧:判断一个列表是否包含另一个列表的全部元素

下一篇: 单元测试的重要性:编写更安全、更可靠的代码

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之“想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!”曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • OPPO K11搭载高性能石墨散热系统:旗舰同款 性能凉爽释放

    日前OPPO官方宣布,将于7月25日14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼
Top