Innanzitutto, A non è bloccato ma piuttosto i thread vengono bloccati alla chiamata di "lock ()". Non c'è nessun meccanismo di blocco nascosto qui. Viene eseguito un semplice controllo che verifica che nessun altro thread stia attualmente bloccando il blocco. Se è bloccato, attende finché non viene sbloccato, altrimenti continua ad eseguire il codice.
Hai ragione che, in generale, il codice di blocco dovrebbe essere evitato a meno che non sia assolutamente necessario e quando si blocca, deve tenere un blocco per il minor tempo possibile per evitare potenziali colli di bottiglia. Una buona regola per sapere quando il codice dovrebbe essere bloccato è porsi le seguenti domande:
- In qualsiasi fase di questo processo, mi interessa se è stato interrotto? (immagina la mancanza di potenza al computer e non tutto il tuo codice viene eseguito .. sarebbe un problema?)
- Se il mio programma continuava a rieseguire il codice a causa di qualche errore del processore, a parte le variabili locali, ci sarebbe qualche tipo di rischio di manomissione del risultato finale nell'esecuzione precedente?
Se rispondi sì a entrambi, congratulazioni! Hai trovato il codice che devi bloccare.
In genere esistono due tipi di blocchi: blocchi di lettura e scrittura. Se vedi solo "lock ()" e "unlock ()", quello che vedi è un blocco di scrittura. Un blocco di scrittura è la forma più grave di blocco e blocca i thread indipendentemente da ciò che stai eseguendo. A volte potrebbe non essere nemmeno necessario eseguire un'operazione, basta semplicemente controllare per vedere se è necessario, ma non si desidera leggere i dati che potrebbero essere stati modificati da un altro thread, quindi è necessario tenerlo in un blocco. Per questo, hai bisogno di un blocco di lettura. I blocchi di lettura vengono sempre utilizzati in combinazione con un blocco di scrittura. In genere si vede immediatamente un blocco di lettura e una sorta di controllo. Se il controllo viene superato, si inserisce un blocco di scrittura per assicurarsi che nessun thread possa accedere alla sezione di blocco della lettura finché non si è certi che si trovi in uno stato coerente.
Se lo scrivi correttamente, non devi sapere se un thread è bloccato o meno, proprio come non sai quando scrivere su un file causerà il blocco di un programma mentre viene utilizzato da un altro programma.
Se questo non ha risposto alla tua domanda, allora forse non ho seguito completamente quello che stavi chiedendo.