volatile关键字的使用
volatile变量直接在CPU和内存之间交换,不通过一级、二级缓存。
考虑下面的代码:
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Gadget { public : void Wait() { while (!flag_) { Sleep(1000); // sleeps for 1000 milliseconds } } void Wakeup() { flag_ = true ; } //... private : bool flag_; }; |
上面代码中Gadget::Wait的目的是每过一秒钟去检查一下flag_成员变量,当flag_被另一个线程设为true时,该函数才会返回。至少这是程序作者的意图,然而,这个Wait函数是错误的。