【发布时间】:2018-05-11 06:12:29
【问题描述】:
我以为std::lock()和std::try_lock()的区别只在于try_lock(),如果锁不可用,立即返回false,而std::lock()则进入阻塞状态。
void lock( Lockable1& lock1, Lockable2& lock2, LockableN&... lockn );
使用死锁避免算法锁定给定的可锁定对象 lock1, lock2, ..., lockn 以避免死锁。
int try_lock( Lockable1& lock1, Lockable2& lock2, LockableN&... lockn);
按从第一个开始的顺序调用try_lock,尝试锁定每个给定的可锁定对象lock1、lock2、...、lockn。
我有以下两个问题:
- 为什么
std::lock()可以避免死锁而std::try_lock不能? - 为什么在
std::lock中,锁的顺序无关紧要(可能是lock2、lock 3、lock1,...),而在std::try_lock()中,锁的顺序保持不变(lock1、lock2、lock3... .)
【问题讨论】:
-
我对 C++ 线程库了解不多,所以我可能会大错特错,但我猜只是
try_lock不能死锁。 -
给定答案的附加信息:
try_lock,因为它返回失败锁的索引,is useful in the implementation oflock。链接的 libc++ 实现被 comparison study of the different ways to implementlock称为“Smart & Polite”。