Gratislunchen är över; parallellismen gör entré (del 3)
Så två processer kan inte försöka använda samma variabel samtidigt. Det ger problem. En naiv lösning är ju att bara förhindra dem från att använda samma variabel samtidigt. Det brukar kallas lås eller mutexes (mutex står för mutual exclusion och betyder att flera saker inte får komma åt en variabel samtidigt.)
Process 1 sätter ett lås på variabeln den använder, gör sitt med den, och låser sen upp låset. Process 2 får då sätta sitt lås på den. Det är faktiskt så här man oftast gör i dag när man gör något parallellt. Man låser variabler eller delar av minnet. Tyvärr är det inte utan problem.
Tänk dig att Erika och Jonas går på dagis båda två. Det finns två lådor med lego som man behöver för att bygga en tuff borg. Både Erika och Jonas vill bygga den där borgen, men de pratar inte med varandra så de vet inte om att den andra vill det.
Erika går fram till en av lådorna och sätter sitt lås på den för att han kommer att använda den. Erika går vidare till den andra lådan och upptäcker att Jonas har satt sitt lås på den. Erika ställer dig där och väntar på att Jonas ska bli klar med lådan och låsa upp sitt lås, men det händer aldrig. Erika står där natt efter natt och dag efter dag men aldrig låser Jonas upp sin låda.
Har du listat ut vad som har hänt? Jonas ville också bygga den tuffa borgen, så han låste lådan som var närmast honom och gick till lådan som Erika just hade låst. Där väntar Jonas på att Erika ska låsa upp sin låda, men det händer aldrig. Båda väntar på varandras lås och det här kallas för en deadlock.
Det finns naturligtvis strategier för att undvika deadlocks, som till exempel att alla måste låsa lådorna i samma ordning, men i någorlunda komplicerade system så kommer deadlocks uppstå ändå.
Deadlocks är inte heller det enda problemet med lås. Lås kan vara ineffektiva också. Tänk dig om en process behöver 57 variabler för någon lång uträkning, medan en annan process bara behöver en av de där variablerna för att skriva ut något. Om den långa processen hinner låsa variablerna först måste den lilla, snabba vänta länge på att få göra den där viktiga utskriften som den skulle kunna göra bara den fick.
Då kan man börja prata om lås som hindrar andra från att skriva, men de fortfarande får läsa. I vissa fall fungerar det, i andra är det väldigt dumt; tänk dig ett kärnkraftverk eller sjukhus där programmet inte får läsa en variabel som är halvskriven.
Lås är långt ifrån perfekta. Faktum är att de som arbetar med dem brukar avsky dem, för de är svåra att debugga, de är instabila, de ger jätteful kod och så vidare. De är visserligen lite bättre än att inte ha något skydd alls, men de är väldigt omständliga.











