(注意:使用std :: lock(c ++ 11)对大量CPU负载进行评论时,大部分内容都是多余的,但我认为这个主题应该得到自己的问题和答案.)
我最近遇到了一些示例C++ 11代码:
std::unique_lock<std::mutex> lock1(from_acct.mutex, std::defer_lock);
std::unique_lock<std::mutex> lock2(to_acct.mutex, std::defer_lock);
std::lock(lock1, lock2); // avoid deadlock
transfer_money(from_acct, to_acct, amount);
Run Code Online (Sandbox Code Playgroud)
哇,我想,std::lock听起来很有趣.我想知道它的标准是什么意思?
C++ 11第30.4.3节[thread.lock.algorithm],第(4)和(5)段:
模板空锁(L1&,L2&,L3&...);
4 要求:每个模板参数类型应满足可锁定要求,[注意:
unique_lock类模板在适当实例化时满足这些要求. - 结束说明]5种效果:所有参数通过调用的顺序被锁定
lock(),try_lock()或unlock()在每个参数.调用序列不应导致死锁,否则不会被指定.[注意:必须使用诸如try-and-back-off之类的死锁避免算法,但未指定特定算法以避免过度约束实现.- 结束注释]如果调用lock()或try_lock()抛出异常,unlock()则应调用已被lock()或调用锁定的任何参数try_lock().
请考虑以下示例.称之为"示例1":
Thread 1 Thread 2
std::lock(lock1, lock2); std::lock(lock2, lock1);
Run Code Online (Sandbox Code Playgroud)
这可能是僵局吗?
对标准的简单解读说"不".大!也许编译器可以为我订购我的锁,这将是一种整洁.
现在尝试例2:
Thread 1 Thread 2
std::lock(lock1, lock2, lock3, lock4); std::lock(lock3, lock4); …Run Code Online (Sandbox Code Playgroud)