Программы на C++. Форум разработчиков
Anonymous
Почему вывод этого кода неверен?
Сообщение
Anonymous » 25 ноя 2024, 01:28
Обычно вывод всегда должен быть 200. Но вывод «totalMoney» иногда меньше 200. В чем здесь проблема и как ее исправить?
Код: Выделить всё
#include
#include
#include
#include
#include
using namespace std;
class Account {
public:
Account(string name, double money): mName(name), mMoney(money) {};
public:
void changeMoney(double amount) {
unique_lock lock(mMoneyLock);
mConditionVar.wait(lock, [this, amount] {
return mMoney + amount > 0;
});
mMoney += amount;
mConditionVar.notify_all();
}
string getName() {
return mName;
}
double getMoney() {
return mMoney;
}
private:
string mName;
double mMoney;
mutex mMoneyLock;
condition_variable mConditionVar;
};
class Bank {
public:
void addAccount(Account* account) {
mAccounts.insert(account);
}
void transferMoney(Account* accountA, Account* accountB, double amount) {
accountA->changeMoney(-amount);
accountB->changeMoney(amount);
}
double totalMoney() const {
double sum = 0;
for (auto a : mAccounts) {
sum += a->getMoney();
}
return sum;
}
private:
set mAccounts;
};
mutex sCoutLock;
void randomTransfer(Bank* bank, Account* accountA, Account* accountB) {
while(true) {
double randomMoney = ((double)rand() / RAND_MAX) * 100;
{
lock_guard guard(sCoutLock);
cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79088244/why-is-the-output-of-this-code-incorrect[/url]
1732487309
Anonymous
Обычно вывод всегда должен быть 200. Но вывод «totalMoney» иногда меньше 200. В чем здесь проблема и как ее исправить? [code]#include #include #include #include #include using namespace std; class Account { public: Account(string name, double money): mName(name), mMoney(money) {}; public: void changeMoney(double amount) { unique_lock lock(mMoneyLock); mConditionVar.wait(lock, [this, amount] { return mMoney + amount > 0; }); mMoney += amount; mConditionVar.notify_all(); } string getName() { return mName; } double getMoney() { return mMoney; } private: string mName; double mMoney; mutex mMoneyLock; condition_variable mConditionVar; }; class Bank { public: void addAccount(Account* account) { mAccounts.insert(account); } void transferMoney(Account* accountA, Account* accountB, double amount) { accountA->changeMoney(-amount); accountB->changeMoney(amount); } double totalMoney() const { double sum = 0; for (auto a : mAccounts) { sum += a->getMoney(); } return sum; } private: set mAccounts; }; mutex sCoutLock; void randomTransfer(Bank* bank, Account* accountA, Account* accountB) { while(true) { double randomMoney = ((double)rand() / RAND_MAX) * 100; { lock_guard guard(sCoutLock); cout Подробнее здесь: [url]https://stackoverflow.com/questions/79088244/why-is-the-output-of-this-code-incorrect[/url]