C语言volatile关键字用法

   日期:2022-07-22     文章发布:文章发布    网络转载:生活号    
移动站源标题:http://mip.818114.com/news/item-238072.html 没使用vloatile之前:,每个线程在运行过程中都有自己的工作内存,那么线程1在运行的时候,会将stop变量的值拷贝一份放在自己的工作内存当中。,那么当线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其他事情了,那么线程1由于不知道线程2对stop变量的更改,因此还会一直循环下去。,使用volatile修饰之后就变得不一样了:,第一:使用volatile关键字会强制将修改的值立即写入主存;,第二:使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量stop的缓存行无效(反映到硬件层的话,就是CPU的L1或者L2缓存中对应的缓存行无效);,第三:由于线程1的工作内存中缓存变量stop的缓存行无效,所以线程1再次读取变量stop的值时会去主存读取。,那么在线程2修改stop值时(当然这里包括2个操作,修改线程2工作内存中的值,然后将修改后的值写入内存),会使得线程1的工作内存中缓存变量stop的缓存行无效,然后线程1读取时,发现自己的缓存行无效,它会等待缓存行对应的主存地址被更新之后,然后去对应的主存读取最新的值。,那么线程1读取到的就是最新的正确的值。
 ,每个线程都有自己的运行空间,当线程1读取主内存中的A变量(变量被volatile关键字修饰过)到线程1运行空间中进行修改时,线程2中的A变量缓存行会失效(注意,如果线程1只是读取变量但没有修改变量,那么线程2中的A变量缓存行就是不会失效),当再次使用该变量的时候需要重新去主内存读取修改过的A最新值来用。,

没使用vloatile之前:

每个线程在运行过程中都有自己的工作内存,那么线程1在运行的时候,会将stop变量的值拷贝一份放在自己的工作内存当中。

那么当线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其他事情了,那么线程1由于不知道线程2对stop变量的更改,因此还会一直循环下去。

使用volatile修饰之后就变得不一样了:

第一:使用volatile关键字会强制将修改的值立即写入主存;

第二:使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量stop的缓存行无效(反映到硬件层的话,就是CPU的L1或者L2缓存中对应的缓存行无效);

第三:由于线程1的工作内存中缓存变量stop的缓存行无效,所以线程1再次读取变量stop的值时会去主存读取。

那么在线程2修改stop值时(当然这里包括2个操作,修改线程2工作内存中的值,然后将修改后的值写入内存),会使得线程1的工作内存中缓存变量stop的缓存行无效,然后线程1读取时,发现自己的缓存行无效,它会等待缓存行对应的主存地址被更新之后,然后去对应的主存读取最新的值。

那么线程1读取到的就是最新的正确的值。
 

每个线程都有自己的运行空间,当线程1读取主内存中的A变量(变量被volatile关键字修饰过)到线程1运行空间中进行修改时,线程2中的A变量缓存行会失效(注意,如果线程1只是读取变量但没有修改变量,那么线程2中的A变量缓存行就是不会失效),当再次使用该变量的时候需要重新去主内存读取修改过的A最新值来用。

,没使用vloatile之前:
免责声明:本网部分文章和信息来源于互联网,本网转载出于传递更多信息和学习之目的,并不意味着赞同其观点或证实其内容的真实性,如有侵权请通知我们删除!(留言删除
 
 
更多>同类行业

同类新闻
最新资讯
最新发布
最受欢迎
网站首页  |  黄页  |  联系方式  |  信息  |  版权隐私  |  网站地图  |  API推送  |  网站留言  |  RSS订阅  |  违规举报  |  陇ICP备22000095号