ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

volatile和线程安全

2022-02-20 19:00:59  阅读:138  来源: 互联网

标签:线程 或者 中断 安全 volatile 操作 全局变量


1.volatile的作用,防止编译器优化。例如一个线程需要操作一个全局变量,为了使得效率更高,它会把这个全局变量首先加载到通用寄存器中,以后再次操作这个全局变量的时候,他将直接从寄存器中取出数据,而不是这个变量的实际地址处得到数据。假如在这期间一个线程或者一个中断打断了程序的执行,并且把这个全局变量的值改了。再回到先前的线程,他将取得一个过期的数据,这显然不是我们想要的。
一般说来,volatile 用在如下的几个地方:
1) 中断服务程序和其他任务共享的变量应该加 volatile。
2) 多任务环境下各任务间共享的变量应该加 volatile,如果使用了同步机制也可以不加。
3) 存储器映射的硬件寄存器通常也要加 volatile 说明,因为每次对它的读写都可能有不同意义。
2.线程安全,同步机制。防止在多线程或者中断中对共享数据或者资源的同时操作导致数据或资源出现不符合预期的结果。例如一个线程在对全局变量执行a++操作,这条语句转成汇编语句也将是好几条指令,如果在这期间被线程或者中断打断也进行a++操作。这时出现的结果将不是编程者所期待的,这时候可以用原子操作。(这时使用volatile不正确)
3.正确使用同步机制的代码不仅能保证线程安全,而且能防止编译器优化(参考知乎https://zhuanlan.zhihu.com/p/102406978),这时将不用使用volatile。
4.某些时候对于全局变量也可以不用同步机制而只用volatile。例如如果能保证某个线程在操作全局变量的时候,不会被操作该全局变量的中断或者线程打断。或者被打断后,对这个变量的操作将不影响你先前线程的操作。这种情况其实锁机制也能使用。但是我感觉volatile的速度比加锁的方式会更快些。

标签:线程,或者,中断,安全,volatile,操作,全局变量
来源: https://blog.csdn.net/Linux_Nan87/article/details/123034240

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有