È possibile provare la sicurezza del thread?


9

Dato un programma composto da variabili e istruzioni che modificano queste variabili e una primitiva di sincronizzazione (un monitor, mutex, java sincronizzato o C #'s lock), è possibile provare che un tale programma è thread-safe?

Esiste persino un modello formale per descrivere cose come la sicurezza del filo o le condizioni di gara?


2
Sì, ma le lingue del mondo reale possono essere un dolore nel culo poiché la loro semantica concorrente non è sempre ben definita / fissa. Inoltre, non tutto è decidibile in ogni modello. È un campo ampio; google "Teoria della concorrenza" per avere un'impressione. In particolare, esiste una ricca teoria che coinvolge le reti di Petri.
Raffaello

Risposte:


9

Dimostrare che un programma è "thread-safe" è difficile. È possibile, tuttavia, definire concretamente e formalmente il termine "corsa ai dati". Ed è possibile determinare se una traccia di esecuzione di una specifica esecuzione di un programma ha o meno una corsa di dati nel tempo proporzionale alla dimensione della traccia. Questo tipo di analisi risale almeno al 1988: Barton P. Miller, Jong-Deok Choi, "Un meccanismo per un debug efficiente di programmi paralleli", Conf. su Prog. Lang. Dsgn. e impl. (PLDI-1988): 135-144 .

Data una traccia di un'esecuzione, per prima cosa definiamo un ordine parziale accada prima tra gli eventi nella traccia. Dati due eventi e che si verificano sullo stesso thread, quindi o . (Gli eventi sullo stesso thread formano un ordine totale dato dalla semantica sequenziale del linguaggio di programmazione.) Gli eventi di sincronizzazione (ad esempio mutex acquisisce e rilascia, ad esempio), danno un inter-thread aggiuntivo prima dell'ordine parziale. (Se il thread rilascia un mutex e quindi il thread acquisisce quel mutex, diciamo che il rilascio avviene prima dell'acquisizione.)un'Bun'<BB<un'ST

Poi dato due accessi dati (lettura o scrittura variabili che sono non sincronizzazione variabili) e che sono nella stessa posizione di memoria, ma di fili diversi, e in cui o è un'operazione di scrittura diciamo che c'è un data- gara tra e se non né .un'Bun'Bun'Bun'<BB<un'

Lo standard C ++ 11 è un buon esempio. (La sezione pertinente è 1.10 nelle bozze delle specifiche disponibili online.) C ++ 11 distingue tra oggetti di sincronizzazione (mutex e variabili dichiarate con un atomic<>tipo) e tutti gli altri dati. La specifica C ++ 11 afferma che il programmatore può ragionare sugli accessi ai dati su una traccia di un programma multithread come se fosse coerentemente sequenziale se gli accessi ai dati sono tutti liberi da razza di dati.

Lo strumento Helgrind (parte di Valgrind) esegue questo tipo di rilevamento basato sui dati già accaduto come fanno diversi strumenti commerciali (ad esempio Intel Inspector XE.) Gli algoritmi negli strumenti moderni si basano sul mantenimento degli orologi vettoriali associati a ogni thread e sincronizzazione oggetto. Penso che questa tecnica di utilizzo degli orologi vettoriali per il rilevamento della corsa dei dati sia stata introdotta da Michiel Ronsse; Koen De Bosschere: "RecPlay: un sistema di registrazione / riproduzione pratico completamente integrato", ACM Trans. Comput. Syst. 17 (2): 133-152, 1999 .


6

Dal punto di vista pratico, esiste un sistema di verifica VCC che può essere utilizzato per dimostrare formalmente la sicurezza dei thread dei programmi C.

Questa è una citazione dal sito web:

VCC supporta la concorrenza: è possibile utilizzare VCC per verificare i programmi che utilizzano la concorrenza sia a grana grossa che a grana fine. Puoi persino usarlo per verificare le tue primitive di controllo della concorrenza. La verifica di una funzione garantisce implicitamente la sicurezza del thread in qualsiasi ambiente concorrente che rispetti i contratti relativi alle sue funzioni e strutture di dati.


2
Come funziona? Qual è il modello formale sottostante? Si noti che l'OP non richiede (solo) uno strumento!
Raffaello

1

Questa è un'area molto difficile da garantire la correttezza del programma per quanto riguarda l'esclusione delle condizioni di gara, una sorta di "tallone d'Achille" di elaborazione parallela. L'approccio migliore per la correttezza del programma è generalmente quello di evitare primitive di basso livello e lavorare con schemi di progettazione di livello superiore (ad es. Dalle librerie) che garantiscano la sincronizzazione dei thread. Esiste un modello CSP, che comunica i processi sequenziali di Hoare, che ha alcune prove di correttezza dato che gli sviluppatori si limitano al "framework". Ha una certa somiglianza concettuale e origine / sovrapposizione cronologiche per unire "tubi e filtri" sebbene non abbia (ancora?) Trovato un collegamento diretto tra i due.

Altri due framework che tentano di migliorare la correttezza della parallelizzazione attraverso modelli di progettazione e che hanno la maggior parte degli algoritmi / modelli di progettazione standard / noti a questo scopo:


1
Questo può essere un buon consiglio (di programmazione), ma non risponde affatto alla domanda (CS).
Raffaello

1
?!? la critica non è affatto specifica
vzn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.