C++ 语法实验室之volatile关键字
来源:互联网 发布:win7和mac双系统 编辑:程序博客网 时间:2024/06/06 10:01
大道理不讲多了用实验说话,以下是标准C++写的一个最简单的例子来诠释volatile的作用
操作系统:Win7 64位
编程IDE:Visual Studio 2012
编译模式:release
例子原理:对于全局变量i,在主线程延迟3s赋值,在另一个线程从一开始持续打印输出这个i,看i有无改变
例子源码:
#include <iostream>#include <thread>int i=80;//如果前面加上关键字violatile,即violatile int i=80;可避免在Release模式BUG//睡眠多少毫秒void Sleep_MS(long long ms){std::chrono::milliseconds timespan(ms);std::this_thread::sleep_for(timespan);}void thread_proc(){while (true){Sleep_MS(500);printf("输出i的值:%d\r\n",i);//std::cout << "thread id = " << std::this_thread::get_id() << std::endl;}}int main(int argc, char* argv[]){std::thread td(thread_proc); Sleep_MS(3000);i=10;while (1);return 0;}上述执行结果可以发现,在release模式下多线程访问同一个变量的时候,他是不能检测到这个变量在其他线程的更改的,这是编译优化的bug,若要准确得到这个变量的正确值,那么就该在他前面加上violatile关键字。实际上violatile关键字正如他的本意“不稳定”,他让编辑器认知到这个变量是不稳定的,很容易被别的线程或则别的其他东西所改变,比如:操作系统、硬件或者其它线程,所以必须每次从内存准确读出,形象的说就是不能读缓存什么之类.
总结:
由于编译器release下优化的bug,导致没有用violatile修饰的变量往往因为一些因素(典型的就是多进程非本进程修改过这个变量),使得程序无法正确读对这个变量,所以要用violatile来修饰这个变量,解决此bug
0 0
- C++ 语法实验室之volatile关键字
- C关键字之 volatile
- C++ 语法实验室之extern关键字
- C++ 语法实验室之mutable关键字
- C++ 语法实验室之operator关键字
- C++ 语法实验室之 inline 关键字
- C++ 语法实验室之 static 关键字
- C++ 语法实验室之 friend 关键字
- C++ 语法实验室之explicit关键字
- C语言关键字之volatile
- C语言之--volatile关键字
- C语言知识点学习之volatile关键字
- C 关键字之别搞砸了 volatile
- C语言关键字之volatile的使用
- c语言之volatile和register关键字
- C/C++之volatile关键字详解
- C语言之volatile关键字的应用
- C/C++区别之 Volatile 关键字
- 第九周 项目二-Time类中的运算符重载(续)
- C# 泛型实现链表、代码重用
- Xcode插件之Alcatraz的安装和遇到的问题
- 程序员到项目经理:从内而外的提升(比较全面的介绍)
- Block的基本使用、typedef给Block定义别名、Block的应用场景、Block的注意事项
- C++ 语法实验室之volatile关键字
- ORA-64204: 出现部分多字节字符
- SharePreference
- Spring中如何拿到HttpServlet
- true && true如何转换?
- Java写入xml (1)
- 字符数组和指针的sizeof(),strlen()以及getline()
- 【LeetCode】Merge Intervals
- Css position属性