为什么std :: lock中没有超时支持?

Kno*_*abe 10 c++ locking c++11

如果我想在没有死锁风险的情况下获取多个锁,我可以使用该std::lock函数:

int data1, data2;
std::mutex m1, m2;
std::unique_lock<std::mutex> lock1(m1, std::defer_lock);
std::unique_lock<std::mutex> lock2(m2, std::defer_lock);

std::lock(lock1, lock2);           // guaranteed deadlock-free

// work with data1 and data2
Run Code Online (Sandbox Code Playgroud)

但是,如果我想在指定的时间内获取锁定,否则会超时怎么办?是否存在try_until类似于wait_until期货和条件变量的锁定的原因?

How*_*ant 13

为什么std :: lock中没有超时支持?

  1. 因为没有人提出它.

  2. 因为这个领域是如此有争议,所以提议越少,就越有可能接受它.

  3. 因为我们害怕如果我们标准化一切,你会感到无聊.

  4. 这是留给读者的练习.

嗯......我的想法已经不多了...... :-)

哦!

如果您需要,您可以轻松自己做:

更新

这是我更喜欢的重写:

#include <mutex>
#include <chrono>

template <class Clock, class  Duration, class L0, class L1>
int
try_lock_until(std::chrono::time_point<Clock, Duration> t, L0& l0, L1& l1)
{
    std::unique_lock<L0> u0(l0, t);
    if (u0.owns_lock())
    {
        if (l1.try_lock_until(t))
        {
            u0.release();
            return -1;
        }
        else
            return 1;
    }
    return 0;
}

template <class Rep, class  Period, class L0, class L1>
int
try_lock_for(std::chrono::duration<Rep, Period> d, L0& l0, L1& l1)
{
    return try_lock_until(std::chrono::steady_clock::now() + d, l0, l1);
}


int main()
{
    std::timed_mutex  m1, m2;
    try_lock_for(std::chrono::milliseconds(50), m1, m2);
}
Run Code Online (Sandbox Code Playgroud)

正如安东尼所说,随意提出这个问题.也可以随意使用它,让我们知道它是否真的有用.


Ant*_*ams 11

std::timed_mutextry_lock_untiltry_lock_for成员的职能.但是,你是对的,没有相应的std::lock超时.

使用超时锁定互斥锁仅用于特定的利基.使用超时锁定多个互斥锁并不是任何人都有足够强烈建议的东西,所以它不在C++ 11中.

标准委员会目前正在积极寻求下一个标准的提案.如果您认为超时感知的等价物std::lock是有价值的,为什么不写一个提案?