function TUnitTest.ThreadMutex(const Sender: XInterface): XResult; xcc; var X, Y, Z: XInt; begin for X := 0 to GlobalLoops-1 do begin GMutex.Lock(); Z := Global+1; for Y := 0 to 10000 do SetGlobal(Z); GMutex.UnLock(); end; Result := xsOK; end; this is instantiated in the unit test like so: 16: begin XAssert(XMutexCreate(nil, nil, False, XMutex, GMutex)); XAssert(XThreadCreate(nil, @ThreadMutex, False, 1024, XThread, T1)); XAssert(XThreadCreate(nil, @ThreadMutex, False, 1024, XThread, T2)); XAssert(XThreadCreate(nil, @ThreadMutex, False, 1024, XThread, T3)); XAssert(T1.Join()); XAssert(T2.Join()); XAssert(T3.Join()); Assert(Global = GlobalLoops*3); end;