关于银行账户操作这个同步互斥问题的代码
时间: 2024-10-14 08:13:09 浏览: 34
C# 多线程银行账户存取简单模拟(未涉及并发互斥)
5星 · 资源好评率100%
在处理银行账户操作这类场景时,通常会涉及到存款、取款等操作,这需要对账户余额进行原子性的增减。以下是使用C++和`std::atomic`来解决同步互斥的一个简单示例:
```cpp
#include <iostream>
#include <atomic>
class BankAccount {
private:
std::atomic<int> balance; // 使用原子类型防止数据竞争
public:
BankAccount(int initial_balance) : balance(initial_balance) {}
void deposit(int amount) {
balance.fetch_add(amount, std::memory_order_relaxed); // 同步加法操作
}
bool withdraw(int amount) {
if (amount > balance.load(std::memory_order_seq_cst)) {
return false; // 资金不足
}
balance.fetch_sub(amount, std::memory_order_release); // 同步减法操作
return true;
}
int getBalance() const {
return balance.load(std::memory_order_seq_cst); // 读取操作保持有序
}
};
int main() {
BankAccount account(1000);
std::thread t1([&account] { account.deposit(500); });
std::thread t2([&account] { account.withdraw(200); });
t1.join();
t2.join();
std::cout << "Final balance: " << account.getBalance() << std::endl;
return 0;
}
```
在这个例子中,`std::atomic<int>`用于存储余额,`fetch_add`和`fetch_sub`操作保证了多线程环境下的数据一致性。`deposit`和`withdraw`方法使用适当的内存序确保了操作的可见性和线程安全性。
阅读全文