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

Why no timeout support in std::lock?

本文关键字:超时 支持 lock std 为什么      更新时间:2023-10-16

如果我想在不冒死锁风险的情况下抓取多个锁,我可以使用 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

但是,如果我想在指定时间段内获取锁,否则超时怎么办? 有没有理由对锁没有类似于期货和条件变量wait_until try_until

为什么 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);
}

正如安东尼所建议的那样,请随时提出这个建议。 也可以随意使用它,并让我们知道它是否真的有用。

std::timed_mutex具有try_lock_untiltry_lock_for成员函数。但是,您是对的,没有等效的超时std::lock

使用超时锁定互斥锁仅在特定的利基中使用。用超时锁定多个互斥锁并不是任何人强烈想要提出的事情,所以它不是在 C++11 中。

标准委员会目前正在积极寻求下一个标准的提案。如果您觉得等效于std::lock的超时感知功能很有价值,为什么不写一个提案呢?