13

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

但是如果我想在指定的时间段内获取锁并且超时呢?有没有理由没有try_until类似于wait_until期货和条件变量的锁?

4

2 回答 2

14

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

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

于 2012-09-24T17:05:29.510 回答
11

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

使用超时锁定互斥锁仅在特定领域中使用。使用超时锁定多个互斥锁并不是任何人都强烈建议提出的,所以它不在 C++11 中。

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

于 2012-09-24T16:58:47.017 回答