Korrektheten i ett samtidigt program är betydligt mer komplex än i ett sekventiellt program på grund av de extra dimensionerna av tidpunkten, sammanflätning och delade resurser. Ett samtidigt program anses vara korrekt om det uppfyller dess specifikation *oavsett schemaläggning av dess samtidiga trådar eller processer *. Detta innebär att programmet producerar den förväntade utgången och uppvisar det önskade beteendet under alla möjliga utförande -interiklar.
Flera aspekter bidrar till definitionen av korrekthet i ett samtidigt program:
* Säkerhet: Programmet går aldrig in i ett ogiltigt tillstånd. Detta inkluderar att undvika frågor som:
* Datasatser: Flera trådar som har åtkomst till och modifierar samma delade minnesplats utan korrekt synkronisering, vilket leder till oförutsägbara resultat.
* Deadlocks: Två eller flera trådar blockeras på obestämd tid och väntar på att varandra ska släppa resurser.
* Livelocks: Trådar förändrar kontinuerligt tillstånd som svar på varandra, men ingen gör framsteg.
* svält: En eller flera trådar nekas ständigt tillgång till en delad resurs.
* Rasförhållanden: Resultatet beror på den oförutsägbara ordningen i vilken trådar körs.
* Livskraft: Programmet gör så småningom framsteg och avslutas om det ska. Detta inkluderar att säkerställa att:
* Trådar får så småningom nödvändiga resurser.
* Programmet når så småningom ett avslutande tillstånd.
* Funktionalitet: Programmet producerar rätt utgång och uppnår sitt avsedda syfte. Detta liknar sekventiella program, men komplicerade av den samtidiga karaktären av exekvering. Det slutliga resultatet måste vara konsekvent i alla möjliga exekveringsscenarier.
Därför innebär att bevisa riktigheten i ett samtidigt program vanligtvis att visa att:
1. Alla möjliga sammanflätningar av trådavrättningar leder till ett giltigt sluttillstånd. Detta är oerhört utmanande och ofta opraktiskt att göra uttömmande.
2. Programmet är fritt från säkerhetsöverträdelser (dödlås, datastopp osv.). Detta behandlas ofta genom noggrann design och användning av synkroniseringsmekanismer (mutexer, semaforer, bildskärmar etc.).
3. Programmet uppfyller dess livlighetsegenskaper. Detta innebär att visa att programmet så småningom kommer att slutföra sina uppgifter och inte fastnar i en oändlig slinga eller dödläge.
Sammanfattningsvis innebär korrekthet i samtidig programmering att garantera förutsägbart och pålitligt beteende i alla möjliga exekveringsplaner. Detta kräver noggrann uppmärksamhet på synkronisering, resurshantering och rigorösa test- och verifieringstekniker. Formella metoder kan användas för rigorös verifiering, men dessa är ofta beräkningsmässigt dyra och endast tillämpliga på mindre program. Därför krävs vanligtvis en kombination av noggrann design, testning och potentiellt formell verifiering för att säkerställa korrektheten i ett samtidigt program.