本文介绍多线程环境下并行编程的基础设施。主要包括:
volatile编译器有时候为了优化性能,会将一些变量的值缓存到寄存器中,因此如果编译器发现该变量的值没有改变的话,将从寄存器里读出该值,这样可以避免内存访问。 但是这种做法有时候会有问题。如果该变量确实(以某种很难检测的方式)被修改呢?那岂不是读到错的值?是的。在多线程情况下,问题更为突出:当某个线程对一个内存单元进行修改后,其他线程如果从寄存器里读取该变量可能读到老值,未更新的值,错误的值,不新鲜的值。 如何防止这样错误的“优化”?方法就是给变量加上volatile修饰。 volatile int i=10;//用volatile修饰变量i......//something happened int b = i;//强制从内存中读取实时的i的值
OK,毕竟volatile不是完美的,它也在某种程度上**了优化。有时候是不是有这样的需求:我要你立即实时读取数据的时候,你就访问内存,别优化;否则,你该优化还是优化你的。能做到吗? 不加volatile修饰,那么就做不到前面一点。加了volatile,后面这一方面就无从谈起,怎么办?伤脑筋。 其实我们可以这样: int i = 2; //变量i还是不用加volatile修饰#define ACCESS_ONCE(x) (* (volatile typeof(x) *) |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|