首页 > 其他分享 >指令重排两大原则

指令重排两大原则

时间:2023-12-04 20:01:16浏览次数:26  
标签:Thread 两大 Rule 指令 线程 发生 先行 重排 操作

as-if-serial语义:

不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序结果不能被改变。

为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变结果。

happens-before原则:

  • 程序次序规则(Program Order Rule):在一个线程内,按照程序代码顺序,书写在前面的操作先行发生于书写在后面的操作。准确地说,应该是控制流顺序而不是程序代码顺序,因为要考虑分支、循环等结构。
  • 管程锁定规则(Monitor Lock Rule):一个unlock操作先行发生于后面对同一个锁的lock操作。这里必须强调的是同一个锁,而“后面”是指时间上的先后顺序。
  • volatile变量规则(Volatile Variable Rule):对一个volatile变量的写操作先行发生于后面对这个变量的读操作,这里的“后面”同样是指时间上的先后顺序。
  • 线程启动规则(Thread Start Rule):Thread对象的start()方法先行发生于此线程的每一个动作。
  • 线程终止规则(Thread Termination Rule):线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值等手段检测到线程已经终止执行。
  • 线程中断规则(Thread Interruption Rule):对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测到是否有中断发生。
  • 对象终结规则(Finalizer Rule):一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始。
  • 传递性(Transitivity):如果操作A先行发生于操作B,操作B先行发生于操作C,那就可以得出操作A先行发生于操作C的结论。

 

标签:Thread,两大,Rule,指令,线程,发生,先行,重排,操作
From: https://www.cnblogs.com/lin513/p/17875799.html

相关文章

  • 指令cache一致性
    指令cache一致性​​N2alsogetsoptionalhardwareinstructioncachecoherency.ARMrecommendsenablingitonsystemswithalotofcoresbecausebroadcastingsoftware-issuedinstructioncacheinvalidateswouldnotbescalable.Toimplementinstructionca......
  • Vue 常用的指令都有哪些?
    1、v-model多用于表单元素实现双向数据绑定(同angular中的ng-model)2、v-for格式:v-for="字段名in(of)数组json"循环数组或json(同angular中的ng-repeat),需要注意从vue2开始取消了$index3、v-show显示内容(同angular中的ng-show)4、v-hide隐藏内容(同angular......
  • 图形渲染ISA指令集分析
    图形渲染ISA指令集分析1ISA定义就像任何语言都有有限的单词一样,处理器可以支持的基本指令/基本命令的数量也必须是有限的,这组指令通常称为指令集(instructionset),基本指令的一些示例是加法、减法、乘法、逻辑或和逻辑非。请注意,每条指令需要处理一组变量和常量,最后将结果保存在......
  • (自用)基于unity的指令(命令)模式
    指令模式1.配置输入 所有游戏中都包含玩家输入指令的部分(这些部分通常写在游戏循环中如unity中的UpData())游戏会每一帧都进行一次读取,当玩家按下相应按键时则会进行对应方法 为了可以时刻检测并记录玩家进行的操作,或者对某个对应的操作的指令进行更改,我们需要将这些......
  • jenkins使用shell提交git指令时,怎么使用 credential凭证信息
    在Jenkins中使用shell脚本提交Git指令时,你可以通过使用Git凭据信息来进行认证。这可以通过以下步骤来实现:设置Git凭据:在Jenkins中,你可以在“凭据”(Credentials)中添加Git的用户名和密码。在Jenkins主界面,点击“凭据”->“系统”->“全局凭据”->“添加凭据”,然......
  • vue关于自定义指令
    私有自定义指令(在与data()同级结构中进行配置)//私有自定义指令的节点directives:{//定义名为color的指令,指向一个配置对象color:{//当指令第一次被绑到元素上的时候,会立即触发bind函数,只会调用一次//形参中的el表示当前指令所绑定到的那个d......
  • 汇编指令长度计算
    汇编指令长度计算1、无操作数指令没有操作数的指令,指令长度为1字节。如es:ds:cbwxlat2、操作数只涉及寄存器操作数只涉及寄存器的指令,指令长度为2字节。如moval,[si]movax,[bx+si]movds,ax3、操作数涉及内存地址的指令操作数涉及内存......
  • Linux关于vim的一些操作指令
    1.模式:2.Vim具有多种工作模式,最基本的有两种:命令模式和插入模式。3.在命令模式下,键盘输入被解释为命令,例如移动光标、删除文本等。4.在插入模式下,键盘输入直接插入到文本中。5.基本操作:6.进入插入模式:按下i键。7.保存文件:在命令模式下输入:w。8.退出Vim:在命令模式下输入:q。9......
  • 手机直播源码,js实现懒加载、vue实现图片懒加载指令
    手机直播源码,js实现懒加载、vue实现图片懒加载指令图片懒加载监听滚动条滚动事件,当视口的高度+滚动高度,大于图片所在位置举例顶部的偏移量时(也就是距离),加载图片资源 index.html<!DOCTYPEhtml><html> <head>  <metacharset="UTF-8">  <metaname="viewport"conte......
  • ​​MySQL 指令​​
    MySQL指令基本概念SQL指令SQL指令是用于访问和处理数据库的标准的计算机语言。对于MySQL等常用数据库都可以通过使用SQL访问和处理数据系统中的数据。注意事项SQL对大小写不敏感。标识符应避免与关键字重名!可用反引号(`)为标识符包裹。注释单行注释:#注释内容多行注释:/*......