Skip to content

freegatik/Concurrency

Repository files navigation

Concurrency

Практические демо примитивов многопоточности уровня ОС, лежащих в основе 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 там не поддерживается.

About

OS concurrency primitives in C — threads, processes, synchronization: the fundamentals behind GCD and Swift Concurrency

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages