|
| 1 | +# Зачем создан модуль sync (совместимость с loom) |
| 2 | + |
| 3 | +Коротко о тестах упоминается [тут](../../README.md). |
| 4 | + |
| 5 | +Модуль `sync` — это тонкий слой абстракций синхронизации, созданный специально для запуска детерминированных проверок |
| 6 | +конкурентности с помощью библиотеки [loom](https://docs.rs/loom/latest/loom/). |
| 7 | + |
| 8 | +**Ключевая идея**: код проекта использует примитивы синхронизации не напрямую из `std::sync`, а через этот модуль. |
| 9 | +Тогда в обычном режиме выполнения используются стандартные примитивы, а в режиме моделирования (`loom`) — их |
| 10 | +"подменённые" аналоги. Это позволяет `loom` контролировать блокировки, условные переменные, барьеры, атомики и перебор |
| 11 | +межпоточных расписаний. |
| 12 | + |
| 13 | +## Зачем это нужно |
| 14 | + |
| 15 | +- Обычные многопоточные тесты недетерминированы: редкие гонки и ошибки упорядочивания трудно воспроизвести. |
| 16 | +- `loom` систематически перебирает возможные interleavings и выявляет скрытые проблемы видимости и неправильные |
| 17 | + порядок/синхронизацию. |
| 18 | +- Чтобы `loom` мог управлять синхронизацией, примитивы должны быть подключены через абстракцию, позволяющую подмену |
| 19 | + реализаций — этим и занимается модуль `sync`. |
| 20 | + |
| 21 | +## Как это работает |
| 22 | + |
| 23 | +- В "нормальном" запуске (cargo run/test) `sync` предоставляет тонкие обёртки над `std::sync` и атомиками. |
| 24 | +- В "loom-режиме" те же API перенаправляются на эквиваленты из `loom`, что делает возможным детерминированный перебор |
| 25 | + расписаний. |
| 26 | + |
| 27 | +## Как использовать |
| 28 | + |
| 29 | +- Импортируйте и используйте примитивы из `src/sync/mod.rs` вместо прямого использования `std::sync`. |
| 30 | +- Для запуска проверок с `loom` соберите и запустите тесты с конфигурацией/фичами, которые переключают реализацию на |
| 31 | + `loom`. |
| 32 | +- Ограничивайте пространство состояний (количество потоков, шагов и т.п.) в тестах под `loom`, чтобы проверки |
| 33 | + завершались за разумное время. |
| 34 | + |
| 35 | +## Что это даёт |
| 36 | + |
| 37 | +- Детерминированные, воспроизводимые проверки конкурентности. |
| 38 | +- Раннее обнаружение гонок данных, нарушений **happens-before**, неправильного выбора memory orders |
| 39 | + (`Relaxed`/`Acquire`/`Release`/`SeqCst`). |
| 40 | +- Повышение уверенности, что корректность не зависит от "везения" конкретного расписания исполнения. |
0 commit comments