On Thu, 14 Apr 2005 16:04:33 -0400, Diego Novillo <[EMAIL PROTECTED]> wrote:
> On Thu, Apr 14, 2005 at 05:40:04PM +0200, Jason Merrill wrote: > >> But the memory model for the language must provide semantics that make it >> possible for threaded programs to be written. Currently, if you want to >> write a portable pthreads program you need to use a mutex around all uses >> of shared memory, because they are the only way to guarantee sequential >> memory ordering. The volatile proposal provides a lighter-weight way to >> write portable code with explicit memory ordering. You need this for >> lockless algorithms to work. > Not necessarily. Sequential memory ordering is not always > desirable. There exist concurrent algorithms out there that rely > on extremely weak memory ordering semantics for performance. I shouldn't have used the term "sequential memory ordering." Nobody is suggesting that C++ should enforce sequential consistency between threads. But even in the weakest memory models...*especially* in the weakest memory models, you need a way of making sure that you are up to date with the global state (in one of several senses) before you continue execution, and acquire/release semantics are a very convenient synchronization model. Consider Double-Checked Locking (http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html). I used DCL with explicit memory barriers to implement thread-safe initialization of function-local statics (libstdc++-v3/libsupc++/guard.cc). The proposed change to volatile semantics would allow me to write it more simply, by just making the initialized flag volatile. Yes, volatile would be stronger than is actually necessary for DCLP, but I don't have to use it if I want finer-grained control over the synchronization. > Seems to me that if C++ is all of the sudden interested in > dictating memory semantics for threaded programs, it should also > provide language capabilities for other synchronization models > and for threads (as in Java, though the memory model of Java used > to have problems of its own, dunno if they've been fixed). I believe the plan is to offer library functions which provide finer-grained control over synchronization primitives, but that volatile would be good enough for most uses, and easy to teach. > Anything else will only be an incomplete specification. > Particularly if it dictates stronger semantics on 'volatile', > which has been long used in chaotic situations where you either > don't care about synchronization or are doing it explicitly. The main reason I posted this now was to get more information about current uses of volatile, so I can block this proposal in the committee if necessary. I find it hard to believe that volatile is currently used in multithreaded code in ways that would be negatively impacted by this change, but I'm very interested in examples. The device driver case seems like a more plausible objection to me, but I'd like to see an example there, too. Jason