Testa och testa-och-ställa

Inom datavetenskap används test -and-set CPU- instruktionen för att implementera ömsesidig uteslutning i multiprocessormiljöer . Även om ett korrekt lås kan implementeras med test-and-set, kan det leda till resurskonflikt i busy lock (orsakat av busslåsning och cache-ogiltigförklaring när test-and-set-operation behöver komma åt minnet atomiskt ).

För att sänka overheaden används ett mer utarbetat låsprotokolltest och test-and-set .

Givet ett lås:

 boolesk  låst := false  // delad låsvariabel 

Inträdesprotokoll är:

  procedure  EnterCritical() {  do  {  while  ( locked == true )  skip  // spin tills låset  verkar  ledigt  }  while  (  TestAndSet  (locked) == true )  // försök faktisk atomlåsning med hjälp av  test-and-set  -instruktionen  } 

Exitprotokoll är:

 procedure  ExitCritical() { locked := false } 

Ingångsprotokollet använder normala minnesläsningar för att vänta på att låset blir ledigt. Test-and-set används bara för att försöka få låset när normal minnesläsning säger att det är gratis. Således sker de dyra atomminnesoperationerna mer sällan än i ett enkelt snurr runt test-and-set.

Om det använda programmeringsspråket stöder kortslutningsutvärdering , kan ingångsprotokollet implementeras som:

   procedure  EnterCritical() {  while  ( locked == true or TestAndSet(locked) == true )  skip  // spin until locked  } 

Varning

Även om denna optimering är användbar vid systemprogrammering , bör den undvikas vid samtidig programmering på hög nivå när begränsningar är oklara och missförstådda. Ett exempel på dålig användning är ett liknande formspråk som kallas dubbelkontrollerad låsning , som är osäker utan särskilda försiktighetsåtgärder och kan vara ett antimönster .

Se även

  •   Gregory R. Andrews, Grunderna för flertrådad, parallell och distribuerad programmering, s. 100–101. Addison-Wesley, 2000. ISBN 0-201-35752-6 .