I slutet av 90 talet var jag med om att skriva ett kommersiellt program som använde flera trådar. Det var första gången som jag deltog i ett projekt där vi använde Microsoft COM arkitektur, en föregångare till .NET, och utnyttjade flera trådar. Så här många år senare är det jag minns mest hur mycket dessa olika trådar ställde till det för oss. Det var svårt att designa på ett bra sätt, här var väl MS COM en bidragande orsak eftersom det var alldeles nytt och vi var nybörjare dess arkitektur, men också felsökningen blev svårare då det blev svårt att reproducera fel osv.
Minns också att vi hade ett typiskt objektorienterat problem då vi använde C++ och förstås de bibliotek som följde med för stränghantering. I ett läge som inte verkade så speciellt fick vi ett märkligt beteende. Det tog enorma resurser vilket visade sig vara en tilldelning av en sträng till en annan men eftersom det av någon anledning, som jag inte minns, gjordes med ett tecken i taget så skapades det en sträng med kort längd och sedan behövde den utvidgas och mer minne allokeras för vart tecken som lades till. När man då har strängar som råkade bli i alla fall 1000-talet tecken så ansträngde det minneshanteringen till den milda grad att den tidens dator säckade ihop.
Men åter till trådar i program. Jag skrev senare ett program i Eiffel som använde många trådar. Lite av ett experiment att ha många parallellt arbetande processer för att göra backup av filer på mina datorer och flytta dem till andra. Det fungerade bra till slut men det var svårt att få rätt på alla trådar. I alla fall så införde Eiffel (www.eiffel.com) standarden ett nytt koncept som kalla SCOOP för många år sedan och nu har det börjat komma kompilatorer med stöd för detta. Det innebär att man lyfter parallella processer till en helt annan abstraktionsnivå. Detta gör man enbart genom att införa ett nytt nyckelord i språket ”separate” vilket en variabel kan deklareras som. Om en variabel är separat så körs den i en egen tråd eller process. ni kan läsa mer om SCOOP här: https://www.eiffel.com/values/parallel-programming/
En viktig sak med SCOOP är att kompilatorn detekterar om man försöker hantera en variabel utan att man har den reserverad eller om den i tillgänglig överhuvudtaget i den process/tråd som exekverar. Jag har påbörjat en konvertering av mitt trådade program från EiffelThreads, med semaforer etc till SCOOP. Det som förvånade mig var att det fanns så många delar av mitt program som hanterade samma variabler från fler trådar utan att jag hade tänkt på det eller skyddat dem med t ex semaforer. Nu fungerade programmet klart tillfredsställande ändå men med många användare så hade svårhittade problem säkert bubblat upp till ytan.
Vill ni hitta att språk där man kan skriva programvara med god kvalitet och dessutom får mycket hjälp med detta av kompilatorn så titta gärna lite närmare på Eiffel. Det är det språk jag använt sedan slutet av 90-talet när jag själv har kunna välja utvecklingsmiljö. När nu processorerna inte växer genom att klockfrekvensen ökar utan genom att det körs flera trådar/processer på en CPU eller flera samverkande processorer så kommer program med flera trådar att bli nödvändiga i framtiden och dessa är en klar utmaning för oss programmerare.