On Sun, 2007-10-28 at 21:43 +0100, Bart Van Assche wrote: > On 10/28/07, Robert Dewar <[EMAIL PROTECTED]> wrote: > > Bart Van Assche wrote: > > > > > My opinion is that, given the importance of multithreading, it should > > > be documented in the gcc manual which optimizations can cause trouble > > > in multithreaded software (such as (3) and (4)). It should also be > > > documented which compiler flags must be used to disable optimizations > > > that cause trouble for multithreaded software. Requiring that all > > > thread-shared variables should be declared volatile is completely > > > unacceptable. > > > > Why is this unacceptable .. seems much better to me than writing > > undefined stuff. > > Requiring that all thread-shared variables must be declared volatile, > even those protected by calls to synchronization functions, implies > that all multithreaded code and all existing libraries have to be > changed.
Yes, of course that is out of the question. Instead all shared variables are treated as sharable. This is NOT the same as volatile. Sharable variables need to be 'de-registered' (dumped out of aliasing registers) at function call boundaries. This is MUCH less strict than volatile, which is at every sequence point. If the function call is to a visible function, gcc can look in it to see if it might fiddle a mutex, and if not, there's no need to dump the registers. In particular, there's no synchronisation point when a function is inlined. IMHO the effect of this is to change the optimiser so that local variables not addressed are preferred for lifting to registers over globals or addressed locals. C++ non-static members must be treated as sharable, even if they're private, however this is not necessarily a big deal if they're inline. The effect seems to be that this: if(cond)x++; can quite safely be replaced by r0 <- x; if(cond) r0++; x <- r0; which is the topic of this discussion. If this code mutually excludes other accesses to x, then it is safe, and if it doesn't, then the programmer is responsible for writing undefined behaviour, not the compiler. -- John Skaller <skaller at users dot sf dot net> Felix, successor to C++: http://felix.sf.net