代码之家  ›  专栏  ›  技术社区  ›  1800 INFORMATION

boost线程中的假解除阻塞

  •  10
  • 1800 INFORMATION  · 技术社区  · 17 年前

    我在报纸上看到了这段有趣的文章 Boost thread documentation 今天:

    void wait(boost::unique_lock<boost::mutex>& lock)
    

    ...

    效果:自动调用lock.unlock() 线程将在收到通知时解除阻止 呼叫此->通知某人()或 虚假地 . 当线程被解锁时(对于 通过调用lock.lock()重新获取 在等待调用返回之前。这个 也可以通过调用 lock.lock()如果函数以 例外。

    所以我感兴趣的是“虚假”这个词的含义。为什么线程会因为虚假的原因而被解锁?如何解决这个问题?

    2 回复  |  直到 17 年前
        1
  •  11
  •   1800 INFORMATION    17 年前

    This article by Anthony Williams

    无法预测虚假尾迹: 用户的观点。但是, 通常发生在线程库 无法可靠地确保等待 线程不会错过通知。 使条件变量无效, 线程库将唤醒该线程 从它的等待中,而不是从

    他还指出,你不应该使用 timed_wait 重载需要一个持续时间,通常应该使用带有谓词的版本

    这是初学者的错误,还有一个 这很容易用简单的方法克服 规则:始终在 变量更阴险的虫子来了 从计时的等待()。

    This article by Vladimir Prus 这也很有趣。

    但是为什么我们需要while循环, 我们不能写:

    if (!something_happened)
      c.wait(m);
    

    返回时不需要任何“通知”电话。 这就是所谓的虚假唤醒 POSIX明确允许。 本质上,只从“等待”返回 指示共享数据可能会丢失 已更改,因此必须删除数据 再次评估。

    好吧,那为什么这个问题还没有解决呢? 去修理它。正在将呼叫包装为“等待” 其他原因。但这些原因 需要解释,而虚假的 失败

        2
  •  2
  •   Jon Skeet    17 年前

    This blog post 给出了Linux的一个理由,即 futex 当信号传递到进程时返回系统调用。不幸的是,它没有解释其他任何事情(事实上,它要求提供更多信息)。

    这个 Wikipedia entry on spurious wakeups (顺便说一句,这似乎是一个posix范围的概念,不限于boost)可能也会引起您的兴趣。

    推荐文章