Hoppa till innehållet

Införde fullständig strikt samtidighet i Swift 6 utan actors och överbryggade en blockerande händelseloop i C till main actor genom en producent, en konsument och en ordning — efter att ha konstaterat att en task per händelse förlorar den ordning som gränssnittet är beroende av.

strikt samtidighet med en enda ordning, och inga actors

Situation. Den fullständiga strikta samtidighetskontrollen i Swift 6 gör datakapplöpningar till kompileringsfel i stället för sporadiska krascher. Det är när den införs mot ett C‑bibliotek som det blir svårt: kärnans händelseloop är ett blockerande anrop som måste köras utanför huvudtråden för all framtid, och värdena den lämnar tillbaka är pekare utan några som helst samtidighetsgarantier. Kompilatorn kan inte resonera om något av det och vägrar allt tills gränsen är uttryckligen beskriven.

Uppgift. Fullständig kontroll måste slås på utan nödutgångar, vilket innebar att utforma övergången från en blockerande C‑loop till main actor i stället för att annotera sig runt den.

Handling. Det självklara angreppssättet är en actor per delsystem, och det förkastades efter mätning snarare än av smakskäl. Att starta en task per inkommande händelse låter körmiljön schemalägga dem i godtycklig ordning, och kärnans händelseström är ordnad — en händelse om att ett meddelande har ändrats som går om händelsen om att samma meddelande har skapats ger ett gränssnitt som visar en redigering av något som ännu inte finns. Att actors är återinträdesbara gör saken värre, inte bättre, eftersom en actor kan pausa mitt i en metod och behandla ett annat anrop. Det som ersatte den är medvetet enkelt: en producenttråd som äger den blockerande loopen, en konsument, en kö mellan dem och ett enda hopp över till main actor på slutet. Ordningen bevaras eftersom det finns exakt en väg och ingenting går om något annat. De osäkra typer som korsar den gränsen kapslas in i typer vars trådsäkerhet intygas i wrappern i stället för att antas, och intygandet är dokumenterat tillsammans med skälet till att det håller — pekaren ägs av en enda tråd och kopieras innan den lämnas över.

Resultat. Appen kompilerar med fullständig strikt samtidighetskontroll utan några undertryckta varningar, och händelseordningen är en strukturell egenskap snarare än en förhoppning. Priset är att designen är mindre parallell än den skulle kunna vara: allt kanaliseras genom en enda konsument, och om den konsumenten någon gång blir en flaskhals kräver lösningen att man på nytt härleder vilka händelser som säkert kan byta ordning, vilket är precis den analys som det här undvek.

En del av en längre historik — och den finns i sin helhet här.

Varje post är skriven på samma sätt: situationen, uppgiften, vad vi gjorde och vad som förändrades.

Se hela historiken