Вы не подчинялись CppCoreGuidelines CP.44: Не забудьте назвать ваши lock_guards и unique_locks :).
В
for (int i = 0; i < 5000; ++i)
{
std::lock_guard<std::mutex> { m };
lst.push_back(std::to_string(i));
}
вы создаете только временныйstd::lock_guard
объект, который создается и уничтожается немедленно.Вам нужно присвоить объекту имя, как в
{
std::lock_guard<std::mutex> lg{ m };
lst.push_back(std::to_string(i));
}
, чтобы защита блокировки сохранялась до конца блока.
И как вы уже узнали ( CppCoreGuidelines ):
Использовать средства защиты RAII (lock_guard, unique_lock, shared_lock), никогда не вызывать mutex.lock и mutex.unlock напрямую (RAII)
Если вы используете Microsoft VisualStudio, я рекомендую использовать анализ кода и активировать хотя бы Microsoft Native Recommended Rules .Если вы сделаете это, вы получите предупреждение анализа компилятора.
предупреждение C26441: Объекты охраны должны быть названы (cp.44).