代码之家  ›  专栏  ›  技术社区  ›  Ronny Brendel

条件变量、互斥体和锁之间的差异

  •  65
  • Ronny Brendel  · 技术社区  · 17 年前

    C++11 interfaces

    提前感谢。

    3 回复  |  直到 3 年前
        1
  •  83
  •   Antti Huima    17 年前

        3
  •  3
  •   Aliakbar Abbasi    7 年前

    monitor .

    RAII

    produced-consumer problem 是其中之一。如果我们想实现一个消费者线程从与生产者共享的缓冲区读取项目,我们应该用互斥体保护缓冲区,但在不使用条件变量的情况下,我们应该锁定互斥体,检查缓冲区并读取项目(如果它不为空),解锁并等待一段时间,再次锁定并继续。如果缓冲区经常为空(忙于等待),这是浪费时间,而且会有大量的锁定和解锁以及睡眠。

    我们需要的生产者-消费者问题的解决方案必须更简单、更高效。监视器(互斥体+条件变量)在这里对我们有所帮助。我们仍然需要一个互斥体来保证互斥访问,但条件变量可以让我们休眠并等待特定条件。这里的条件是生产者向缓冲区添加一个项目。生产者线程通知消费者线程缓冲区中有和项,消费者唤醒并获取该项。简单地说,生产者锁定互斥体,将一些东西放入缓冲区,通知消费者。消费者锁定互斥体,在等待条件时休眠,当缓冲区中有东西时醒来,并从缓冲区中获取项目。这是一个更简单、更有效的解决方案。

    this page