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.