簡體   English   中英

如何在 C++ 中使用原子變量作為互斥量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM