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中没有超时支持?
因为没有人提出它.
因为这个领域是如此有争议,所以提议越少,就越有可能接受它.
因为我们害怕如果我们标准化一切,你会感到无聊.
这是留给读者的练习.
嗯......我的想法已经不多了...... :-)
哦!
如果您需要,您可以轻松自己做:
更新
这是我更喜欢的重写:
#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_mutex有try_lock_until和try_lock_for成员的职能.但是,你是对的,没有相应的std::lock超时.
使用超时锁定互斥锁仅用于特定的利基.使用超时锁定多个互斥锁并不是任何人都有足够强烈建议的东西,所以它不在C++ 11中.
标准委员会目前正在积极寻求下一个标准的提案.如果您认为超时感知的等价物std::lock是有价值的,为什么不写一个提案?
| 归档时间: |
|
| 查看次数: |
3221 次 |
| 最近记录: |