【问题标题】:Why timed lock doesn't throw a timeout exception in C++0x?为什么定时锁不会在 C++0x 中抛出超时异常?
【发布时间】:2011-02-14 15:58:18
【问题描述】:

C++0x 允许在达到给定时间之前锁定互斥体,并返回一个布尔值,说明互斥体是否已被锁定。

template <class Clock, class Duration>
bool try_lock_until(const chrono::time_point<Clock, 
                    Duration>& abs_time);

在某些情况下,我考虑了一种异常情况,即锁定由于超时而失败。在这种情况下,应该更适合例外。

为了有所作为,函数 lock_until 可用于在达到锁定前的时间时获取超时异常。

template <class Clock, class Duration>
void lock_until(const chrono::time_point<Clock, 
                Duration>& abs_time);

您认为 lock_until 在某些情况下应该更合适吗?如果是,在哪些方面?如果不是,为什么 try_lock_until 总是更好的选择?

【问题讨论】:

  • 这个问题中是否有特定于 try_lock_until 的内容?一种情况是否“异常”,取决于(a)被调用者是否可以返回有意义的值,以及(b)调用者是否可以继续。我们无法评论 (b),因此我们无法告诉您抛出异常是否是对 try_lock_until 返回 false 的明智回应。任何调用者都可以通过抛出异常来响应任何返回错误值的函数。除了内存不足和无法返回值的情况(例如,动态转换为引用失败)之外,C++ 标准库不会抛出太多问题。
  • @Steve 我认为您的评论可能是不需要 lock_until 的原因。你能补充一个答案吗?我的问题是当 try_lock_until 返回 false 时是否会抛出超时异常。如果是,在哪些情况下?

标签: c++ boost synchronization c++11 timeoutexception


【解决方案1】:

你不能只检查返回值并抛出你自己的异常吗?

if ( ! my_lock.try_lock_until( my_start_time ) ) {
    throw realtime_error( "Couldn't start in time!" );
}

此外,快速浏览 FCD 中的线程和异常库不会显示任何与时间相关的异常类,因此 std:: 中没有类型可以自然地抛出 lock_until

【讨论】:

  • @Potato 我看到你已经听从了我给史蒂夫的建议。你应该让史蒂夫自己做。
  • @Vic 我没有复制 cmets 的想法,如果这就是你的意思。如果你感觉好点,我可以制作这个 CW。
  • @Potatowatter 好吧,我接受你可以有同样的想法。我同意标准提供的界面是最小的,允许用户做任何她想做的事情。您找不到 lock_until 是正常的,因为这是我的问题的一部分。问题是您更喜欢自己编写的代码还是抛出常见异常的特定函数。
  • @Vicente:就个人而言,我会在定义新的异常类后立即定义生成异常的函数,假设有几个这样的截止日期要错过。我不喜欢复制粘贴代码。但是只在一个地方调用的过度指定的函数也很糟糕。
  • +1 我终于接受了你的回答,因为用户总是可以轻松实现它。但我真的认为,添加基于异常的定时锁会打开一个窗口,以获得更多友好的功能。
猜你喜欢
  • 2011-04-11
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
相关资源
最近更新 更多