1、原子操作
2、按照特定的顺序加锁/解锁
3、使用C++11的新特性:
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;
}