Boost logo

Boost :

From: Phil Endecott (spam_from_boost_dev_at_[hidden])
Date: 2008-02-08 18:19:23


Howard Hinnant wrote:
> On Feb 8, 2008, at 2:42 PM, Anthony Williams wrote:
>> Howard Hinnant <hinnant <at> twcny.rr.com> writes:
>>> 3. The yields are absolutely necessary to get the high performance
>>> mentioned in the previous note.
>>
>> I find this comment intriguing. Is this always the case, or does it
>> depend on the specifics of how a mutex is implemented on a given platform?
>
> That is a question I've been asking and myself for a long time,
> unfortunately without a satisfactory answer. Here's my experience,
> and a few guesses...

Hi Howard,

If you can share the code, I'll see how it performs on my Linux systems.

I bet it depends greatly on the workload. I have been considering
writing an instrumented mutex that records how often it blocks. In my
real code, the answer seems to be almost never.

Peter's comment about evil spin-waits in lock() is interesting as I was
considering implementing something like that. I wonder about this instead:

void mutex::lock() {
   if (atomic-attempt-to-lock) { // uncontended
     return;
   };
   // first wait, try yielding since it's fast:
   sched_yield();
   if (atomic-attempt-to-lock) { // got lock on 2nd attempt
     return;
   }
   // We failed again. Maybe there are lots of threads waiting; in that
   // case it will be more efficient to futex_wait() since the kernel will
   // then only wake us when our lock has been woken.
   futex_wait(....);
}

I'll try to find time to experiment with this soon.

Phil.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk