对银行的某一个公共账户count,原有存款1000元现客户1和客户2各自从不同的储蓄所同时向该账户存入各1000元。要求系统保证对公共账户count的互斥访问。
时间: 2024-11-17 14:28:18 浏览: 10
要确保对银行公共账户`count`的互斥访问,防止并发时出现数据不一致的情况,我们可以使用线程同步机制,如C++11或更高版本中的`std::mutex`(互斥锁)和`std::lock_guard`。以下是一个简单的例子,展示了如何使用这些工具来保护账户计数:
```cpp
#include <thread>
#include <mutex>
#include <atomic> // 使用原子类型避免竞态条件
class BankAccount {
public:
std::atomic<int> count; // 使用原子整型保证无须加锁读取
mutable std::mutex mutex; // 用于保护修改count的操作
void deposit(int amount, int clientId) {
std::lock_guard<std::mutex> lock(mutex); // 获取锁
count.fetch_add(amount); // 使用原子操作累加计数
// 可能需要在这里记录客户的id或其他信息,具体取决于需求
std::cout << "Client " << clientId << " deposited " << amount << " to the account.\n";
}
};
int main() {
BankAccount account;
std::thread t1deposit(account.deposit, 1000, 1);
std::thread t2deposit(account.deposit, 1000, 2);
t1deposit.join();
t2deposit.join();
std::cout << "Final account balance: " << account.count.load() << "\n"; // 不需加锁读取当前余额
return 0;
}
```
在这个例子中,我们创建了一个`BankAccount`类,其中`count`成员变量用`std::atomic<int>`确保原子性,从而避免了多个线程同时修改时可能出现的问题。`deposit`函数内部使用了`std::lock_guard`来自动获取和释放互斥锁,确保同一时间只有一个线程能够修改账户。
当两个线程同时调用`deposit(1000, ...)`时,它们会被互斥锁锁定,确保账户计数的正确性。
阅读全文