首页 > 其他分享 >并发学习笔记

并发学习笔记

时间:2023-10-25 18:45:21浏览次数:37  
标签:count 硬件 缓存 cache 笔记 学习 并发 line

本人最近在用C++进行并发编程,虽然之前都已经完成了6.824的lab,但对并发的很多细节还是知其然和不知其所以然,于是决定在此记录一下学习到的相关知识。首先声明,本人水平十分有限,而关于这类问题也有很多深度好文,在此记录的仅为简化的自己的理解。

cache line 与 false sharing

想必大家对缓存都有所了解,对于L1缓存来说,存取数据的最小单位是cache line, 而通常大小为 64 byte。所以即使没有用锁保护数据,如果两个变量内存位置邻近,在缓存中位于同一个cache line, 两个线程不能同时修改这两个变量。

因为缓存是专属于cpu的,必须将缓存中的数据写回主存,修改的数据才能可见。 然而写回单位也是cahce line, 所以如果擅自写回可能会影响其他线程修改的数据,从而导致错误。所以硬件会负责协调同步,防止在同一个cache line中的共享数据

互不影响。这也是false sharing 名字的来源:硬件会阻止对同一个cache line中数据的并发访问。代码看上去是并发的,也没有锁,但是并没有并发的性能。

现在回顾一下最简单的并发问题: count++

如果两个线程同时修改count,硬件如何处理这种情况?

对于硬件来说,false sharing阻止的是无意识的影响cache line中的数据,如果这个线程明确表示要修改count的内容,硬件认为这个操作是有效的,如果现在cache line未同步,硬件会把这个修改暂存起来,等到下一次同步的时候再写入。但下次同步的时候,count的值可能已经增加了,但硬件不可能重新计算,硬件负责的就是指令要求修改count位置的数据到某个值,硬件一定会将这个值成功写入,并且不影响其他内存位置的数据。至于值符不符合语义,那就是程序员的问题了。

本人才疏学浅,仅仅就逻辑上讨论了一下并发操作硬件要保证的数据行为, 不涉及buffer store等细节。如有错误请不吝赐教。

标签:count,硬件,缓存,cache,笔记,学习,并发,line
From: https://www.cnblogs.com/nanlour/p/17787887.html

相关文章

  • diffusion扩散模型\datawhale组队学习——v3先运行一半(下)
    微调:好像是用新数据训练旧模型的管道。微调的参数有:图形大小:image_size数据批次:batch_size为减轻显卡压力,将数据批次再切分为2(n)倍,num_epochs相对应的,权重更新频率也乘2(n)倍,grad_accumulation_steps总感觉对模型影响不大捏?难道是为了加大图形质量和效果,就相应地延长训练时......
  • Flutter学习资料
    Flutter安装和文档Flutter控件学习FlutterAPP代码结构检测flutter界面元素 Flutter常用插件:flutterdartgetX:  FlutterGetX使用---简洁的魅力JsonToDart(JSONToDart) flutter常用第三方框架: 库功能dio网络框架shared_preferences......
  • RT-Smart 应用开发笔记:fopen 造成文件被清空问题的分析记录
    前言RT-Smart应用(apps)开发环境,ubuntu20.04+win10VSCode最近在调试一个问题,需要使用FILE的fopen、fread等去读取处理一个大文件,为了尽快复现验证问题,随手搜了一下fopen等几个API的用法,调试时闹出来一个【笑话】,程序运行所到之处,把处理过的本地文件清空了。当时初步的目......
  • 《动手学深度学习 Pytorch版》 10.4 Bahdanau注意力
    10.4.1模型Bahdanau等人提出了一个没有严格单向对齐限制的可微注意力模型。在预测词元时,如果不是所有输入词元都相关,模型将仅对齐(或参与)输入序列中与当前预测相关的部分。这是通过将上下文变量视为注意力集中的输出来实现的。新的基于注意力的模型与9.7节中的模型相同,只不过......
  • django学习
     一、准备1、下载、安装2、django-adminstartprojectmysite创建项目3、django-adminstartappblog创建应用3、修改sittings.py      3.1 INSTALLED_APPS中添加'blog'      3.2修改时区 TIME_ZONE='Asia/Shanghai'      ......
  • 学习c语言的心得
    培养良好的编程习惯:C语言是一门底层语言,需要严谨的编码和规范的命名,特别是对于变量、函数和数据类型的命名,要清晰明了,易于理解和维护。同时,编写注释也是非常重要的,能够帮助自己和他人更好地理解代码逻辑。多实践多动手:学习C语言最好的办法就是多动手写代码,通过实践来巩固所学的知......
  • HarmonyOS多音频播放并发政策及音频管理解析
     音频打断策略多音频并发,即多个音频流同时播放。此场景下,如果系统不加管控,会造成多个音频流混音播放,容易让用户感到嘈杂,造成不好的用户体验。为了解决这个问题,系统预设了音频打断策略,对多音频播放的并发进行管控,只有持有音频焦点的音频流才可以正常播放,避免多个音频流无序并......
  • 根号分治学习笔记
    根号分治的核心思想是平衡。板子题。很容易想到两种暴力:一是不做预处理,每次询问暴力查询,这样复杂度是\(\mathcalO(q\times\dfrac{n}{p})\)。二是预处理每个池子的值,每次\(\mathcalO(1)\)查询,复杂度为\(\mathcalO(np)\)。观察两个式子,由于\(q,n\)同阶,结合以下两种算法,......
  • 《流畅的Python》 读书笔记 第5章 一等函数 20231025
    第5章一等函数第四章相对偏僻,但时间上一样要花我很久,就先跳过了,回头再补。而这个第5章节是非常重要的。只是最近工作有点忙,我读的越来越慢了~继续坚持吧。在Python中,所有函数都是一等对象,整数、字符串和字典都是一等对象(注:first-classobject)要成为一等对象,需要满足......
  • Hive学习笔记:nvl和coalesce函数的区别
    nvl函数和coalesce函数都是用来处理空值的函数,但略有不同。注意:非NULL值为NULL,如果是'','','null','NULL'等视为字符串,返回参数本身。一、nvl函数nvl只能处理2个参数,如果第1个不是null,则返回第1个参数,否则返回第2个参数。selectnvl(1,2);--1selectnvl(1,n......