volatile in struct

Sergei Organov osv at topconrd.ru
Tue Feb 17 09:22:55 UTC 2004


Angelo Fraietta <afraiett at bigpond.net.au> writes:
> Sergei Organov wrote:
> 
> >2. Using volatile is almost never a good idea. If you use RTOS primitives
> >   for mutual exclusion correctly, you don't need volatile for your
> >   protected data.
> >
> 
> I would have to dissagree with that. If I had a loop eg
> 
> while (x)
>     {
>        do something
>     }
> 
> And x is decremented in another thread, the compiler can optimise x so it
> will never appear changed without volatile

Actually your code exactly shows why volatile is evil most of times. The code
above should be avoided in applications as it is busy-waiting eating processor
time, -- and that was my point, -- as soon as you think you need 'volatile' in
your code, think more, -- most probably you are going to make a mistake.
(Sometimes there *is* need for 'volatile', e.g., access to hardware registers,
that's why I've put "almost" in my initial reply).

The above code in an RTOS-friendly application could look like this:

while(1) {
  semaphore_obtain(semaphore);
  do_something;
}

You may substitute semaphore with condition variable or any other
synchronization primitive you like.

-- 
Sergei.




More information about the users mailing list