Следующий код содержит потенциальную взаимоблокировку, но кажется необходимой: для безопасного копирования данных в один контейнер из другого оба контейнера должны быть заблокированы, чтобы предотвратить внесение изменений в другой поток.
void foo::copy(const foo & rhs)
{
pMutex->lock();
rhs.pMutex->lock();
// do copy
}
Foo имеет контейнер STL, а «копирование» по существу состоит из использования std::copy. Как заблокировать оба мьютекса, не вводя тупиковую ситуацию?
std::lock
имеет алгоритм предотвращения взаимоблокировок, передающий ему оба мьютекса, и он будет более удобочитаемым для других, чем реализация вашего собственного. - person Mellester   schedule 17.02.2019