Per comprendere la correttezza di una determinata riga di codice di concorrenza basato su blocco, devi comprendere l'intero programma.
Ora puoi risparmiare un po '. Se riesci a dimostrare a te stesso che tutto ciò a cui si accede in quel bit di codice di concorrenza basato su lock è accessibile solo all'interno di un particolare lock, ora devi solo capire ogni bit di codice nel programma che accede anche a quel lock, il suo stato quando avvia l'accesso di blocco e tutto ciò che fa mentre lo trattiene.
Questo perché la concorrenza basata su lock mantiene solo la "sicurezza del thread" bloccando l'accesso ai dati a un numero limitato di thread contemporaneamente (a volte 1, a volte solo lettori, ecc.). Quindi devi capire tutto il comportamento di blocco e il comportamento durante il blocco, per sapere se il sistema di blocco in realtà sta facendo ciò che vuoi.
Successivamente, poiché i blocchi sono soggetti a deadlock, per comprendere più blocchi devi capire non solo il codice in un blocco, ma ogni sequenza possibile puoi acquisire i blocchi.
E i nostri linguaggi e i nostri sistemi di tipi non aiutano molto con queste attività.
Diventa peggio. Come l'altro difficile da rintracciare e gli errori comuni, i problemi di deadlock e race condition di solito non avvengono in modo affidabile. Puoi scrivere il codice, fare alcuni test semplici, persino eseguirlo in produzione e farlo funzionare quasi sempre. Tranne a volte fallisce in modo spettacolare.
Errori spettacolari davvero rari sono difficili da debugare a prescindere di quanto sia facile ragionare. Qui abbiamo rari e spettacolari guasti difficili da ragionare.
E peggiora. Quando si impara a programmare, le persone si imbattono in una serie di ostacoli. Capire lo stato / l'assegnazione / il flusso di dati è un ostacolo che alcuni non riescono a superare. Comprendere i condizionali e le chiamate di funzione è un altro. La ricorsione e l'iterazione gettano alcune persone per un ciclo. Indiretti e puntatori hanno impedito a un intero gruppo di aspiranti programmatori di diventare utili. Gestione delle risorse. E la concorrenza e la sincronizzazione sono un altro ostacolo.
Possiamo generare più programmatori utili rimuovendo alcuni di questi ostacoli "nel modo" di essere produttivi. Esistono linguaggi che nascondono il riferimento indiretto e i puntatori dal programmatore e gestiscono l'attività di gestione delle risorse per te (memoria) e puoi imparare a diventare un programmatore produttivo in quelle lingue senza superare questo ostacolo.
In quasi ogni lingua puoi diventare un "programmatore produttivo" senza superare l'ostacolo della concorrenza. Puoi produrre codice utile, essere uno sviluppatore professionista, laurearsi dall'università - tutti senza mai ottenere concorrenza.
Quelli che non hanno ottenuto il controllo di flusso, il flusso di dati e l'iterazione non sono mai diventati programmatori professionisti. Quelli che non ottengono concorrenza sono grandi sviluppatori produttivi in molte aziende.