2015-01-10 35 views
-5

假設我得到兩個銀行賬戶A和B,我需要自動轉賬。 的設置如下: `如何編寫原子賬戶轉賬功能

struct account{ 
    int64 amount; 
    pthread_mutex_lock m; 
} 

`

這裏是我的方法: `

bool Transfer(int from_account, int to_account, int64 amount) 
{ 
    pthread_lock(&account[from_account].m); 
    bool ret = false; 
    if(accounts[from_account].balance>=amount) 
    { 
     accounts[from_account].balance-=amount; 
     ret = true; 
    } 
    pthread_unlock(&account[from_account].m); 
    pthread_lock(&account[to_account].m); 
    accounts[to_account].balance+=amount; 
    pthread_unlock(&account[to_account].m); 
    return ret; 
} 

`

功能轉移資金從from_account到to_account,返回一個布爾值,只有當帳戶剩餘資金> = ammount時才轉移。 這是一個好的方法嗎?我想這不會導致死鎖問題,但它不會使整個功能非原子?那麼可能有競爭條件?請幫助我,非常感謝。

+2

此功能不是原子的。還有種族條件。並且存在死鎖情況。它並不是特例安全。所以不行。這不是一個好方法。 –

+1

請提出具體問題。另外,什麼平臺? –

+0

_ @ user3799934_您是否考慮過使用[C++標準線程和同步支持](http://en.cppreference.com/w/cpp/thread),而不是在本地使用'pthread'掙扎? –

回答

0

您的代碼邏輯上已損壞。無論from_account的餘額如何,to_account無條件贏得account! (我想成爲to_account所有者:)

在這種情況下,您必須獲得兩個帳戶的鎖,並且它可能導致潛在的死鎖問題。

避免死鎖的最簡單方法是強制執行鎖獲取的順序,例如,較小的索引帳戶最先出現。

bool Transfer(int from_account, int to_account, int64 amount) 
{ 
    // acquire locks (in pre-defined order) 
    if (from_account < to_account) 
    { 
    pthread_lock(&accounts[from_account].m); 
    pthread_lock(&accounts[to_account].m); 
    } else { 
    pthread_lock(&accounts[to_account].m); 
    pthread_lock(&accounts[from_account].m); 
    } 
    // transfer amount 
    bool ret = false; 
    if (accounts[from_account].balance >= amount) 
    { 
    accounts[from_account].balance -= amount; 
    accounts[to_account].balance += amount; 
    ret = true; 
    } 
    // release both locks 
    pthread_unlock(&accounts[from_account].m); 
    pthread_unlock(&accounts[to_account].m); 
    return ret; 
}