gpt4 book ai didi

c++ - 为什么 std::lock 不支持超时?

转载 作者:可可西里 更新时间:2023-11-01 15:38:16 29 4
gpt4 key购买 nike

如果我想在不冒死锁风险的情况下获取多个锁,我可以使用 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 的 futures 和条件变量,这是有原因的吗?

最佳答案

Why no timeout support in 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);
}

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

关于c++ - 为什么 std::lock 不支持超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12568877/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com