volatile 目录
最近看boost并发的相关文档,发现这个关键字我没怎么用过,惭愧惭愧,特意学习。
简介
volatile 关键字在c/c++中与const同级用来修饰变量,通常建立语言级别的memory barrier,用他声明的变量可以被某些编译器未知的因素修改,如操作系统,硬件,其他线程等。遇到这个关键字声明的变量,编译器就不在对其进行优化,当使用violatile声明变量的时候,系统总是从他所在的内存空间直接读取数据,而一般情况下,编译器会对代码进行优化。在连续读取某个内存地址存储的变量时,如果地址没有变化,且在该单线程中没有其他语句改变这个变量中的值,则编译器不会直接去读内存中变量的值,而是从寄存器中直接读取原先边变量的值,所以当有操作系统,硬件,或者其他线程(大多数其他线程争强共享变量时会发生)对改变量进行修改时,就会出现读错误,读出的数据并不是变量现在真正存储的值,从而导致错误的发生。
综上,volatile可以保证每次对变量的访问都是从内存地址直接读取,而不是被编译器优化后可能导致的读错误。
bool extern_tag = false; // 定义一个全局变量,会有多个线程对此变量进行访问
void thread1(void *arg) {
// thread1受extern_tag的控制,只要tag为false,一直执行while循环中的操作
while (