Da jeg for nyligt investerede i en multiprocessorsbundkort, foretog jeg et par tidstagninger ang. synkronisering mellem tr†de. Det gav et par overaskelser! Disse observationer/overaskelser vil jeg lige dele med jer. Min test betod i at lade hovedtr†den og en baggrundstr†d requeste og release en mutex-agtig "dims" et antal gange, hvor jeg s† skiftede "dimsen" ud efter behag (rettelse: fantasi og evne), heriblandt to "dimser", som er extremt hurtige, men bruger data i user space, med det problemer der deraf f›lger. Alle dimserne var pakket p‘nt ind i C++ klasser mm. Her er implementationen af de to extremt hurtige "dimser" ---CUT--- (Watcom-fniller-fnaller gjort mere l‘sbart) void LockedIncrement(unsigned *p) -> "lock inc dword ptr [eax]" void LockedDecrement(unsigned *p) -> "lock dec dword ptr [eax]" unsigned LockedExchange(unsigned *p, unsigned v) -> "lock xchg ecx,[eax]" class FastMutex { unsigned toggle; unsigned waiters; FEventSemaphore try_again; public: FastMutex() : toggle(0), waiters(0), try_again() {} void Request(); void Release(); }; void FastMutex::Request() { LockedIncrement(&waiters); for(;;) { if(LockedExchange(&toggle,1)==0) { LockedDecrement(&waiters); return; } try_again.Wait(); try_again.Reset(); } } void FastMutex::Release() { toggle=0; if(waiters!=0) try_again.Post(); } //---------------------------------------------------------------------------- // A very fast, but unfriendly, mutex class SpinMutex { enum { spin_retries=100 }; unsigned toggle; unsigned waiters; FEventSemaphore try_again; public: SpinMutex() : toggle(0), waiters(0), try_again() {} void Request(); void Release(); }; void SpinMutex::Request() { for(unsigned spin=0; spin