struct BankAccount {
BankAccount(int b) : Balance(b) {}
int Balance;
mutex Mutex;
};
void transferMoney(BankAccount&a, BankAccount& b, int money)
{
lock(a.Mutex, b.Mutex); //将锁需要锁住的临界体全部锁住
//按照某种特定的顺序防止死锁
lock_guard<mutex> lockA(a.Mutex, adopt_lock); //adopt_lock 告诉编译器在析构的时候解锁
lock_guard<mutex> lockB(b.Mutex, adopt_lock);
if (a.Balance <= money)
return;
a.Balance -= money;
b.Balance += money;
}
为了防止加锁解锁顺序的不同造成的死锁问题,可以使用C++11 提供的函数,以一定的机制实现顺序加解锁。