Разбираем, как находить границы критической секции в многопоточном C++: сначала определяем общий ресурс и его инвариант, а уже потом думаем о блокировках (например,
std::mutex). На примерах показываем, почему
++ — это не «одна операция», почему чтение (
size(),
empty(),
average()) тоже участвует в гонках, и как согласованно защищать связанное состояние (
push_back +
+=) в компоненте
TaskStats.