title: Spinlock
text: # Spinlock
  
  In informatica uno spinlock o anche spinning è una tecnica di programmazione che utilizza un ciclo di attesa attiva (busy waiting) per implementare la routine di attesa di un lock. La tecnica consiste nel verificare periodicamente se il lock è stato sbloccato, effettuando un test che può aver luogo ad intervalli di tempo prestabiliti, oppure nel tempo più breve possibile consentito dal sistema.
  
  ## Pro e contro
  
  L'implementazione di uno spinlock può aver luogo interamente nel contesto del task attivo, senza bisogno di chiamare funzioni del sistema operativo o dell'ambiente runtime; utile nei sistemi a multiprocessore in cui il cambio di contesto risulta molto più oneroso (in termini temporali). Il principale inconveniente è l'enorme spreco di tempo computazionale che può essere contrastato solo a costo di un prolungamento degli intervalli di verifica, prolungando in tal modo anche l'attesa media dei thread o processi che concorrono per il lock.
  
  ## Alternative
  
  Quasi tutti i moderni sistemi operativi offrono un'interfaccia apposita per l'implementazione dei lock come parte dell'API. Le funzioni native del sistema operativo sono assai più efficienti degli spinlock e non presentano i problemi di sincronia inerenti a questi, perché utilizzano direttamente il sistema di monitoraggio dello scheduler. Gli ambienti runtime dei linguaggi di programmazione ad alto livello implementano i lock attraverso le apposite funzioni del sistema operativo.
  
  ## Applicazioni pratiche
  
  L'uso di spinlock può essere necessario quando l'ambiente runtime non offre un'interfaccia adatta alla sincronizzazione per mezzo dei lock. È questo il caso di alcuni sistemi operativi real-time che non dispongono di uno scheduler adatto al multitasking. Sulle piattaforme multiprocessore, dove la comunicazione fra thread in esecuzione su processori diversi può durare centinaia o migliaia di cicli di clock, è anche comune l'uso ibrido di spinlock a scadenza, che se non vengono interrotti entro un periodo di tempo limitato o entro un numero prestabilito di iterazioni decadono delegando l'attesa ad un monitor vero e proprio.
  
  