c – 为什么std :: lock()支持deallock避免但std :: try_lock()不支持?

前端之家收集整理的这篇文章主要介绍了c – 为什么std :: lock()支持deallock避免但std :: try_lock()不支持?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我认为std :: lock()和std :: try_lock()之间的区别仅在于try_lock(),如果锁不可用,立即返回false,而在std :: lock()的情况下,它会进入封锁状态.

Cpp reference for std::lock

void lock( Lockable1& lock1,Lockable2& lock2,LockableN&... lockn );

使用死锁避免算法锁定给定的Lockable对象lock1,lock2,…,lockn以避免死锁.

Cpp reference by try_lock

int try_lock( Lockable1& lock1,LockableN&... lockn);

尝试通过从第一个开始按顺序调用try_lock来锁定每个给定的Lockable对象lock1,lockn.

我有以下两个问题:

>为什么std :: lock()提供了死锁避免但是std :: try_lock没有?
>为什么在std :: lock中,锁的顺序无关紧要(可能是lock2,lock 3,lock1,…)而在std :: try_lock()中,锁的顺序是保持的(lock1,lock3. …)

解决方法

  1. Why std::lock() provides deadlock avoidence but std::try_lock doesn’t?

它不需要.如果try_lock无法锁定所有成员,则会释放所有成员.如果另一个线程拥有部分或全部这些资源,您将无法从try_lock获得死锁,因为您将立即返回.

来自try_lock:

If a call to try_lock fails,no further call to try_lock is performed,unlock is called for any locked objects and a 0-based index of the object that Failed to lock is returned.

  1. why in std::lock,order of lock doesn’t matter( it could be lock2,…) while in std::try_lock() order of locks are maintained (lock1,lock3….)

我怀疑是因为轻松.不需要死锁避免算法,因为您要么锁定所有这些算法,要么无法锁定一个,在这种情况下您将释放所有这些算法.因此,最简单的锁定方法是从第一个开始并通过可变参数模板列表进行try_lock.此外,返回值表示它将返回第一个失败锁的索引.为了实现这一点,您必须从左到右进行迭代.

猜你在找的C&C++相关文章