Spring til indhold

Har taget Swift 6 fuldstændig streng samtidighed i brug uden aktører og har bygget bro fra en blokerende C‑hændelsesløkke til hovedaktøren gennem én producent, én forbruger og én rækkefølge — efter at have fastslået, at en opgave pr. hændelse mister den rækkefølge, grænsefladen afhænger af.

Situation. Swift 6’s fuldstændige strenge samtidighedstjek gør datakapløb til oversættelsesfejl i stedet for lejlighedsvise nedbrud. At indføre det over for et C‑bibliotek er der, hvor det bliver svært: kernens hændelsesløkke er et blokerende kald, der skal køre uden for hovedtråden for altid, og de værdier, den leverer tilbage, er pegepinde uden nogen som helst samtidighedsgarantier. Oversætteren kan ikke ræsonnere om noget af det og vil afvise alt, indtil grænsen er beskrevet udtrykkeligt.

Opgave. Fuldstændigt tjek skulle slås til uden nogen nødudgange, hvilket betød at udforme overgangen fra en blokerende C‑løkke til hovedaktøren frem for at sætte påtegninger uden om den.

Handling. Den nærliggende fremgangsmåde er en aktør pr. delsystem, og den blev forkastet på måling frem for smag. At starte en opgave pr. indkommende hændelse lader køretiden planlægge dem i vilkårlig rækkefølge, og kernens hændelsesstrøm er ordnet — en besked‑ændret‑hændelse, der overhaler den besked‑oprettet‑hændelse, den henviser til, frembringer en grænseflade, der viser en redigering af noget, der endnu ikke findes. Aktørers genindtræden gør dette værre, ikke bedre, for en aktør kan afbryde midt i en metode og behandle et andet kald. Det, der erstattede den, er bevidst enkelt: én producenttråd, der ejer den blokerende løkke, én forbruger, én kø imellem dem og et enkelt hop over på hovedaktøren til sidst. Rækkefølgen bevares, fordi der er præcis én vej, og intet overhaler noget. De usikre typer, der krydser den grænse, er pakket ind i typer, hvis trådsikkerhed efterprøves ved indpakningen frem for antages, og efterprøvningen er dokumenteret med hvorfor den holder — pegepinden ejes af én tråd og kopieres, før den overdrages.

Resultat. Programmet oversættes under fuldstændigt strengt samtidighedstjek uden undertrykkelser, og hændelsesrækkefølgen er en strukturel egenskab frem for et håb. Prisen er, at udformningen er mindre parallel, end den kunne være: alt ledes gennem én forbruger, og hvis den forbruger nogensinde bliver en flaskehals, vil rettelsen kræve, at man på ny udleder, hvilke hændelser der trygt kan omordnes, hvilket er præcis den analyse, dette undgik.