struct BankAccount
{
BankAccount(int n) : Balance(n) {}
int Balance;
std::mutex Mutex;
};
void transferMoney(BankAccount &a, BankAccount &b, int money)
{
/************************************************************************/
/*
情况1 线程1: transferMoney(a,b,10); 线程2 : transferMoney(b,a,10);
出现a和b死锁的情况
情况2:线程1: transferMoney(a,b,10); 线程2 : transferMoney(a,b,10);
出现a和b死锁的情况
*/
/************************************************************************/
std::lock(a.Mutex, b.Mutex /* 支持无限参,这里的动作是按 a,b的顺序来全部锁定了,再走一下步,以防出现死锁 */);
std::lock_guard<std::mutex> lockA(a.Mutex, std::adopt_lock); // 由于第一步就全部死锁了,所以告诉模板类,不要再锁,只做析构时,进行解析就行
std::lock_guard<std::mutex> lockB(b.Mutex, std::adopt_lock);
if (a.Balance <= money)
{
return;
}
a.Balance -= money;
b.Balance += money;
}
void testbankaccout()
{
BankAccount a(100000);
BankAccount b(100000);
int q1 = 1;
std::thr
C++ 11 多线程 mutex (三) std::lock_guard,多种锁存在时确定加锁顺序的方式
最新推荐文章于 2024-06-12 09:36:15 发布