У меня есть программа, в которой 4 потока выполняют случайные транзакции между двумя банковскими счетами, при каждой 100-й транзакции на счет начисляются проценты в размере 5% на счет.
Это упражнение для школы, которое я должен сделать, и в предыдущем уроке мы использовали мьютексы, которые казались очень простыми в блокировке раздела кода. Теперь нам нужно сделать то же самое, но с использованием атомарных элементов.
Моя проблема в том, что в настоящее время несколько потоков могут входить в функцию addIntreset
, и проценты могут добавляться несколько раз.
это часть кода, где я проверяю, является ли это сотой транзакцией
void transfer(Account& acc, int amount, string& thread)
{
++m_iCounter;
withdraw(acc, amount);
if (m_iCounter % 100 == 0)
{
addInterest(thread);
}
}
Все потоки проходят через эту функцию и проверяют % 100, а иногда более чем один поток проскальзывает в addInterest. С помощью мьютексов я мог бы ограничить доступ здесь, но как мне это сделать с атомарным?
Может быть, я мог бы решить это как-то внутри addInterest
, но если да, то как? Внутри addInterest
находится следующий код (если несколько раз добавляется более 1 заинтересованного потока):
void addInterest(string& thread)
{
float old = m_iBalance.load();
const float interest = 0.05f;
const float amount = old * interest;
while (!m_iBalance.compare_exchange_weak(old, old + amount))
{
//
}
++m_iInterest;
cout << thread << " interest : Acc" << name << " " << m_iCounter << endl;
}