C++操作系统同步与互斥银行存取钱实列
时间: 2024-10-21 19:13:06 浏览: 2
在C++中,操作系统中的同步与互斥通常用于控制多个线程之间的访问共享资源,比如在银行存取款的例子中,我们有多个客户同时尝试存取账户。这里可以使用一些同步原语如互斥锁(mutex)、条件变量(condition_variable)或者原子操作(atomic operations)来确保数据的一致性和避免竞态条件。
假设有一个简单的银行类BankAccount,它包含一个共享余额和两个方法:deposit(存款)和withdraw(取款)。我们可以这样做:
```cpp
#include <mutex>
#include <condition_variable>
class BankAccount {
private:
std::mutex accountMutex; // 互斥锁
int balance;
std::condition_variable cv; // 条件变量
public:
BankAccount(int initialBalance) : balance(initialBalance) {}
void deposit(int amount) {
std::lock_guard<std::mutex> lock(accountMutex); // 获取锁
try {
balance += amount;
if (balance < 0) throw std::runtime_error("Insufficient funds");
cv.notify_all(); // 释放其他等待的线程
} catch (...) {
lock.unlock(); // 如果出错,解锁并重新抛出异常
}
}
bool withdraw(int amount) {
std::unique_lock<std::mutex> lock(accountMutex); // 获取独占锁
while (amount > balance) { // 等待资金足够
cv.wait(lock, []{ return balance >= amount; }); // 满足条件后唤醒
}
balance -= amount;
if (balance < 0) throw std::runtime_error("Insufficient funds after withdrawal");
return true;
}
};
```
在这个例子中,`accountMutex`确保了只有单个线程能同时修改余额,而`cv`则用于线程间的通信,当存款操作完成时通知正在等待的取款线程。
阅读全文