Need help with communication between multiple threads

Chad J gamerChad at _spamIsBad_gmail.com
Tue Feb 20 17:02:10 PST 2007


kris wrote:
> 
> Basicially, you need to protect the value from contention between two 
> threads. There are a number of ways to do this:
> 
> 1) using native D facilities via the synchronized keyword: expose a 
> getter and setter method, and have them both synch on the same 
> object/lock. This is a fairly heavyweight resolution, but it would work.
> 

So would something like this do the trick?

class Mutex
{
     uint pointlessVariable;
}
Mutex mutex;

uint m_value = 42; // The thing to be protected.
uint value() // getter
{
     synchronized(mutex)
         return m_value;
}
uint value(uint newbie) // setter
{
     synchronized(mutex)
         m_value = newbie;

     return newbie;
}

Or am I supposed to do something else like put m_value inside the mutex 
class?

> 2) get under the covers and utilize a mutex, semaphore, or some other 
> classical synchronization construct exposed by the OS itself. Tango will 
> provide a cross-platform way of doing this in the next release. This is 
> potentially lighter weight than #1
> 

I suppose I'll wait for that release and see what happens.

> 3) use CPU-specific instructions to ensure value access is atomic. This 
> is what Sean has exposed in the Atomic module within Tango. It is a 
> lightweight and low-overhead solution, and works by locking the bus for 
> the duration of the read/write access.
> 

This sounds cool, but I don't quite understand how to use the Atomic 
module - what is msync and which value of it do I pick to make things 
work?  I made a post about this in the Tango forum incase it's more 
appropriate to discuss there.

> 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.
> 

Right, I'll just stay away from that.

> - Kris

When I was porting Phobos to work on ARM-WinCE, it was very helpful to 
be able to discard a module without breaking other parts of the lib, 
namely in the case of that module requiring a broken language feature or 
inline assembly (inline asm is not currently available with 
arm-wince-pe-gdc, and I don't feel like learning ARM asm yet).  That 
said, Atomic looks like it will be very broken on ARM in its current 
state.  I also benchmarked synchronized reads vs atomic reads and yeah, 
synchronized was much slower (I picked "whatever makes it compile" 
values for msync).  So I'll probably implement a version using only 
synchronization and a version that uses Atomic instead whenever possible.


More information about the Digitalmars-d-learn mailing list