Need help with communication between multiple threads

Sean Kelly sean at f4.ca
Tue Feb 20 12:00:35 PST 2007


kris wrote:
> 
> 4) use a small discrete unit for the value. If value is just a byte, the 
> underlying hardware will usually treat it as an indivisible unit, giving 
> you the desired result (similar to #3). However, there are memory 
> barriers involved also, which D respects via the "volatile" keyword. 
> Beyond that, there may be issues with cache-reconciliation on a 
> multi-core device, so this approach is generally not recommended.

The "volatile" keyword is somewhat tricky, as it's effectively a memory 
barrier for compiler optimizations only.  It will prevent the compiler 
from moving loads/stores across the volatile region during optimization, 
but it does not affect the ASM code in any way.  I think it will also 
affect whether register caching of loads occurs, etc, which is 
occasionally necessary if you're performing a busy wait on a shared 
variable.  ie, under normal circumstances:

     while( i == 0 )
     {
         // do nothing
     }

it's clear to the compiler that the value of 'i' will not change during 
the loop, so the code could theoretically be transformed into:

     if( i == 0 )
     {
         while( true )
         {
             // do nothing
         }
     }

which is an equivalent sequence of operations.  In C++, this is called 
the "as if" rule: the compiler can do whatever the heck it wants so long 
as the behavior meets expectations /within the context of the virtual 
machine described for the language/.  For C++, this virtual machine is 
single-threaded so the above transformation is legal.  I believe the 
same is currently true of D, though D provides "volatile" to tell the 
compiler "I don't care what fancy stuff you think you can do to this 
code to make it faster.  Don't do it.  I know more than you do about 
what's going on here."

That said, progress is being made towards defining a multithreaded 
virtual machine for C++, and once it is settled I suspect the D model 
will follow the C++ model in spirit, if perhaps not exactly.

By the way, for any who are interested, Doug Lea described a memory 
model last month that I think has tremendous promise, regardless of 
whether it's chosen for C++.  He describes it here:

http://www.decadentplace.org.uk/pipermail/cpp-threads/2007-January/001287.html


Sean


More information about the Digitalmars-d-learn mailing list