I just read href="https://www.securecoding.cert.org/confluence/display/cplusplus/CON01-CPP.+Do+not+use+volatile+as+a+synchronization+primitive"
rel="nofollow">Do not use volatile as a synchronization primitive article
on CERT site and noticed that a compiler can theoretically optimize the following code
in the way that it'll store a flag
variable in the registers
instead of modifying actual memory shared between different
threads:
bool flag = false;//Not
declaring as {{volatile}} is wrong. But even by declaring {{volatile}} this code is
still erroneous
void test() {
while (!flag) {
Sleep(1000); // sleeps for 1000 milliseconds
}
}
void
Wakeup() {
flag = true;
}
void debit(int
amount){
test();
account_balance -= amount;//We think it is safe
to go inside the critical
section
}
Am
I right?
Is it true that I need to use
volatile
keyword for every object in my program that shares its
memory between different threads? Not because it does some kind of synchronization for
me (I need to use mutexes or any other synchronization primitives to accomplish such
task anyway) but just because of the fact that a compiler can possibly optimize my code
and store all shared variables in the registers so other threads will never get updated
values?
No comments:
Post a Comment