Everything I\'ve read about volatile says it\'s never safe, but I still feel inclined to try it, and I haven\'t seen this specific scenario declared unsafe.
I have a sep
It's completely unsafe, although it might work with some
compilers. Basically, volatile
only affects the variable it's
attached to, so RendererThreadFunction
, for example, could set
stillRendering
false before having finished
renderer->render();
. (This is true even if both
stillRendering
and programRunning
were both volatile.) The
probablility of a problem is very small, so testing probably
won't reveal it. And finally, some versions of VC++ do give
volatile
the semantics of an atomic access under C++11, in
which case, your code will work. (Until you compile with
a different version of VC++, of course.)
Given that renderer->render()
almost certainly takes
a non-negligible amount of time, there's absolutely no reason
for not using a conditional variable here. About the only time
you'd use volatile
for this sort of thing is if the shutdown
mechanism were triggered by a signal (in which case, the type
would be sig_atomic_t
, and not bool
, although in practice,
it probably doesn't make any difference). In that case, there
wouldn't be two threads, but just the renderer thread and
a signal handler.