为什么在 std::lock 中没有超时支持
Why no timeout support in std::lock?
如果我想在不冒死锁风险的情况下抓取多个锁,我可以使用 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 中没有超时支持?
-
因为没有人提出来。
-
因为这个领域非常有争议,以至于提议越少,就越有可能被接受。
-
因为我们害怕如果我们把所有东西都标准化,你会感到无聊。
-
它留给读者作为练习。
嗯。。。我的想法快用完了... :-)
哦!
如果需要,您可以轻松地自己做:
更新
这是我更喜欢的重写:
#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_until
和try_lock_for
成员函数。但是,您是对的,没有等效的超时std::lock
。
使用超时锁定互斥锁仅在特定的利基中使用。用超时锁定多个互斥锁并不是任何人强烈想要提出的事情,所以它不是在 C++11 中。
标准委员会目前正在积极寻求下一个标准的提案。如果您觉得等效于std::lock
的超时感知功能很有价值,为什么不写一个提案呢?
相关文章:
- 编译时未启用intel oneApi CUDA支持
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 为什么istream不支持右值提取
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 扩展光电二极管探测器以支持多个传感器
- MSVC是否支持C++11样式的属性而不是__declspec
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- C++减少modbus_connect超时
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 没有超时的C++条件变量
- 如何在C++(VS2010)中设置超时读取USB端口?
- C++卷曲柱在curl_easy_perform超时
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 如何在Qt 4.8中阻止/忽略/丢弃早于特定超时的用户输入事件
- 哪个C++规范开始支持 std::vector
- 如何检测VS C++编译器是否支持C++11?
- CertGetCertificateChain 具有支持的内存存储和证书信任列表
- Casablanca/cpprestsdk listener.support接受函数,但不支持方法
- 为什么在 std::lock 中没有超时支持