Практические демо примитивов многопоточности уровня ОС, лежащих в основе GCD и Swift Concurrency, реализованные напрямую на POSIX-потоках (C). Цель — понимать, что происходит под капотом iOS-абстракций, а не воспринимать их как магию.
| Файл | Тема | Что показывает |
|---|---|---|
01_thread_race_mutex.c |
потоки, критическая секция, гонка данных, мьютекс | несинхронизированный ++ теряет инкременты; мьютекс делает счёт точным |
02_process_pipe.c |
процесс, изоляция памяти, IPC | изменение в дочернем процессе после fork() не видно родителю; данные идут через pipe |
03_semaphore.c |
считающий семафор | внутри секции одновременно не больше N потоков |
04_deadlock.c |
дедлок и его фикс | два лока в разном порядке зависают; единый порядок захвата чинит |
05_thread_explosion.c |
взрыв потоков, detach |
pthread_create отказывает, когда блокирующих потоков становятся тысячи |
06_atomic.c |
атомарные операции | обычный ++ теряет инкременты; atomic_fetch_add верен без блокировки |
07_monitor_condvar.c |
монитор, условная переменная | producer/consumer синхронизированы через sleep/wakeup, без активного ожидания |
macOS / Linux, clang или gcc:
clang -O0 -o 01 01_thread_race_mutex.c && ./01 # -O0 сохраняет гонку наблюдаемой
clang -o 02 02_process_pipe.c && ./02
clang -o 03 03_semaphore.c && ./03
clang -o 04 04_deadlock.c && ./04 # при DEADLOCK=1 зависает намеренно (Ctrl+C); поставь 0 — фикс
clang -o 05 05_thread_explosion.c && ./05
clang -O0 -o 06 06_atomic.c && ./06
clang -o 07 07_monitor_condvar.c && ./07Проверить гонку данных санитайзером (укажет точное конфликтующее обращение):
clang -O0 -g -fsanitize=thread -o 01_tsan 01_thread_race_mutex.c && ./01_tsan# 01
expected : 8000000
racy : 7966880 # потерянные инкременты — гонка данных
safe : 8000000 # под защитой мьютекса
# 06
plain : 2573168 # потерянные инкременты
atomic : 8000000 # верно, без блокировки
Соответствуют главе 2 (Процессы и потоки) книги Э. Таненбаума «Современные операционные системы»:
- Процессы — модель, создание через
fork(), изоляция памяти, состояния (выполнение / готовность / блокировка). - Потоки — POSIX pthreads (
create/join/detach), общее адресное пространство и приватный стек, а также модели реализации: пользовательская (N:1), ядерная (1:1) и гибридная (M:N) — именно модель M:N лежит в основе кооперативного пула Swift Concurrency. - Синхронизация — критические секции, мьютексы, считающие семафоры, мониторы через условные переменные (sleep/wakeup, защита от потерянного пробуждения), атомарные операции как основа lock-free.
- Проблемы — гонка данных против состояния гонки, дедлок, взрыв потоков, инверсия приоритетов.
Учебный проект, не библиотека. Каждый файл самодостаточен и запускается отдельно. На macOS используются именованные семафоры (sem_open), поскольку безымянный sem_init там не поддерживается.