Skip to content

Commit daa113c

Browse files
committed
docs: add detailed section on sync module and its integration with loom
1 parent 08294ce commit daa113c

2 files changed

Lines changed: 44 additions & 0 deletions

File tree

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ make tools
5656

5757
## Loom
5858

59+
О `loom`: https://github.com/tokio-rs/loom
60+
5961
Это инструмент для тестирования параллельных/конкурентных программ.
6062

6163
На высоком уровне он выполняет тесты многократно, перебирая возможные параллельные исполнения каждого теста в
@@ -65,6 +67,8 @@ make tools
6567

6668
## Miri
6769

70+
О `Miri`: https://github.com/rust-lang/miri
71+
6872
Это интерпретатор для Rust MIR (`Mid-level Intermediate Representation`), который может обнаруживать определенные
6973
классы undefined behavior (**UB**) в Rust-коде, включая:
7074

src/sync/README.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
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

Comments
 (0)