[英]How to use atomic variable as a mutex in C++?
我有一個程序,其中 4 個線程在“銀行帳戶”上同時運行取款/存款操作
我應該將線程與原子同步(學校任務)。 我目前正在使用 compare_exchange 並且它在存款(加法)上工作,因為加法何時完成並不重要。
但是提款有問題,因為帳戶不能為負數 go。
例子。 比方說賬戶余額是300,thread1要取200,檢查沒問題,然后取function。使用compare_exchange,期望值是300,新的是300-200。 Thread2 也想同時從帳戶中提取 200,兩個線程都檢查 ok 並輸入撤回,現在哪個第一個無關緊要,但第二個現在已經期望 go 從 300 到 100,然后執行 100 - 200 和我們遇到了帳戶為負的情況。
我運行了一個大的交易號,它確實發生了我目前有這段代碼用於提款操作
void withdraw(int amount)
{
float old = m_iBalance.load();
while(!m_iBalance.compare_exchange_weak(old, old - amount))
{
//
}
if (m_iBalance < 0 )
{
cout << m_iBalance << endl;
}
}
如何使用 atomic 作為互斥鎖一次只允許一個線程訪問 withdraw function?
這是你想要的嗎?
class Account
{
public:
Account(double balance)
: m_balance(balance)
{
}
void Deposit(double amount)
{
double old_amount, new_amount;
do {
old_amount = m_balance.load();
new_amount = old_amount + amount;
} while (!m_balance.compare_exchange_weak(old_amount, new_amount));
}
bool Withdraw(double amount)
{
double old_amount, new_amount;
do {
old_amount = m_balance.load();
new_amount = old_amount - amount;
if (new_amount < 0) return false;
} while (!m_balance.compare_exchange_weak(old_amount, new_amount));
return true;
}
double Amount() const { return m_balance.load(); }
protected:
std::atomic<double> m_balance;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.