Перейшла на повну сувору перевірку паралельності Swift 6 без акторів, з'єднавши блокувальний цикл подій C з головним актором через одного виробника, одного споживача й один порядок, — з'ясувавши, що окрема задача на кожну подію губить порядок, від якого залежить інтерфейс.
Роботу виконано: вересень 2026
сувора конкурентність з одним порядком і без акторів
Ситуація. Повна сувора перевірка паралельності у Swift 6 перетворює гонки даних на помилки компіляції замість епізодичних аварійних завершень. Складнощі починаються, коли її застосовують до бібліотеки на C: цикл подій ядра — це блокувальний виклик, який має безперервно виконуватися поза головним потоком, а значення, які він повертає, — вказівники без жодних гарантій щодо паралельності. Компілятор не може зробити щодо цього жодних висновків і відхилятиме все, доки межу не буде описано явно.
Завдання. Повну перевірку треба було ввімкнути без жодних лазівок, а отже — спроєктувати перехід від блокувального циклу на C до головного актора, а не обходити проблему анотаціями.
Дія. Очевидний підхід — окремий актор для кожної підсистеми, але його відкинули на підставі вимірювань, а не з міркувань смаку. Якщо створювати окрему задачу для кожної вхідної події, середовище виконання може планувати їх у довільному порядку, а потік подій ядра впорядкований: якщо подія «повідомлення змінено» випередить подію «повідомлення створено», на яку посилається, інтерфейс покаже редагування того, чого ще не існує. Повторний вхід (reentrancy) в актора лише погіршує ситуацію, бо актор може призупинитися посеред методу й обробити інший виклик. Замість цього обрали навмисно просту модель: один потік‑виробник, який володіє блокувальним циклом, один споживач, одна черга між ними й один‑єдиний перехід на головного актора наприкінці. Порядок зберігається, бо шлях рівно один і ніщо нічого не випереджає. Небезпечні типи, що перетинають цю межу, загорнуто в типи, потокобезпеку яких явно гарантує обгортка, а не просто припускають, і це твердження задокументовано разом із поясненням, чому воно справджується: вказівником володіє один потік, і його копіюють, перш ніж передати.
Результат. Застосунок компілюється з повною суворою перевіркою паралельності без жодних придушень, а порядок подій гарантує сама структура, а не надія. Ціна в тому, що архітектура менш паралельна, ніж могла б бути: усе проходить через одного споживача, і якщо він колись стане вузьким місцем, для виправлення доведеться заново з’ясовувати, які події можна безпечно переставляти, — а це саме той аналіз, якого вдалося уникнути.
Читати далі: Написала парсер, який читає справжній C‑заголовок на 7 308 рядків і перевіряє кожне місце виклику, кожну константу переліку й те, що кожен клас‑власник вказівника є final, після того як через написаний вручну заголовок‑заглушку виклики трьох вилучених функцій компілювалися, лінкувалися й аварійно завершувалися. Або перегляньте повне портфоліо.
Одна частина довшого переліку — і він увесь на цьому сайті.
Кожен запис написано однаково: ситуація, завдання, що ми зробили і що змінилося.