In informatica un lock (inglese per «blocco») è un meccanismo di sincronizzazione per limitare l'accesso ad una risorsa condivisa in un ambiente multitasking ad un solo thread o ad un solo tipo di thread alla volta.
Concettualmente un lock è un oggetto di cui un thread deve venire in possesso prima di poter procedere all'esecuzione di una sezione protetta di un programma. Ci sono regole prestabilite che dispongono il possesso di un lock. Nel caso più elementare il lock può essere assegnato ad un solo thread; in altri casi il possesso può coinvolgere in modo esclusivo più thread di lettura oppure un solo thread di scrittura (lock read/write). In ogni caso, se un thread non può acquisire immediatamente il lock deve aspettare che questo diventi libero oppure abbandonare la sezione protetta.
Le implementazioni dei mutex nei monitor di sincronizzazione fanno generalmente uso di lock.
Problemi con i lock
I sistemi di protezione e i meccanismi di sincronizzazione di thread e processi se basati sui lock hanno molti svantaggi:
- È un meccanismo di bloccaggio, il che vuol dire che thread e processi devono aspettare fin quando il lock non viene rilasciato.
- Usare i lock è un approccio conservativo, perché ogni thread deve acquisire il lock ogni qualvolta che vi è una possibilità di conflitto, che è situazione abbastanza rara nelle esecuzioni reali. Un approccio conservativo abitualmente induce un overhead non necessario.
- I lock sono vulnerabili a insuccessi e a difetti. Se un thread che detiene un lock muore, gli altri thread che aspettano il rilascio del lock possono aspettare per sempre.
- La programmazione con l'uso di lock è incline ad errori, come i noti deadlock.
- L'uso dei lock limita la scalabilità e aggiunge complessità.
- La granularità dei dati su cui avviene il lock va bilanciata con i costi di un lock a grana fine.
- I lock non sono componibili: per esempio la cancellazione di un record da una tavola e l'inserimento di un record in un'altra tavola non possono essere combinati in una singola operazione atomica (v. proprietà ACID) con lock.
- Convoglio di lock: tutti i thread devono attendere se un thread che mantiene un lock subisce un context switch per un interrupt o per un page fault (lock convoy).
- Inversione di priorità. Thread o processi con una priorità alta non possono procedere se un thread o un processo detiene un lock comune.
- Debug difficile: i bug associati ai lock dipendono da una specifica esecuzione ed è difficile che si ripetano.
Una strategia è quella di evitare di usare i lock, usando un metodo di sincronizzazione che non blocca il processo, come la tecnica di programmazione lock-free o la transactional memory.
La keyword lock
Nel linguaggio di programmazione C# la keyword lock può essere usata per assicurarsi che un blocco di codice possa essere eseguito senza alcuna interruzione da parte di altri thread, come la keyword synchronized in Java.
Voci correlate
Altri progetti