Нужно написать функцию, которая переводит деньги с одного счета на другой.
struct Account {
mutex mx;
double amount;
};
void transfer(Account& from, Account& to, double value);
Эта функция может вызываться одновременно из разных потоков
В данном случае можно добиться строго одинаковой последовательности доступа путем сравнения указателей на объекты для определения порядка:
void transfer(Account& from, Account& to, double value)
{
auto p_first{::std::addressof(from)};
auto p_second{::std::addressof(to)};
if(p_first == p_second)
{
return;
}
auto const address_first{reinterpret_cast<::std::uintptr_t>(p_first)};
auto const address_second{reinterpret_cast<::std::uintptr_t>(p_second)};
if(address_first > address_second)
{
::std::swap(p_first, p_second);
}
::std::lock_guard<::std::mutex> const lock_first{p_first->mutex};
::std::lock_guard<::std::mutex> const lock_second{p_second->mutex};
from.amount -= value;
to.amount += value;
}
В C++17 можно залочить 2 мьютекса так:
std::scoped_lock lck{from.mx, to.mx};
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости