使用互斥锁来保证对某个资源的互斥访问。它是广泛解决并发问题的默认方案。如果您想在C++中保护一个作用域,可以使用lock_guard。mutex由lock_guard处理。只需在作用域中创建lock_guard,并使用一个mutex进行初始化,然后C ++将为您完成其余工作。当作用域从堆栈中移除时(包括抛出异常或从函数返回),mutex将被释放。这是RAII的思想,而lock_guard是另一个资源处理程序。我很难弄清楚何时使用这些东西(cv、mutex 和 lock)。请问有人能解释或指向资源吗?
有一些并发问题不仅使用互斥锁就能轻松解决,而且简单的解决方案可能会导致复杂性或低效率。例如,生产者-消费者问题 就是其中之一。如果我们想要实现一个消费者线程从与生产者共享的缓冲区中读取项目,我们应该用互斥锁来保护缓冲区,但是,如果没有使用条件变量,我们应该锁定互斥锁,检查缓冲区,如果不为空,则读取一个项目,解锁它并等待一段时间,再次锁定它并继续。如果缓冲区经常为空(忙等待),这将是浪费时间的,而且还会有很多锁定、解锁和休眠。
我们需要解决生产者消费者问题的方案必须更简单和更高效。这里有一个监视器(互斥锁+条件变量)可以帮助我们。我们仍然需要互斥锁来保证互斥访问,但是条件变量让我们可以睡眠并等待特定条件。这个条件就是生产者向缓冲区添加项目。生产者线程通知消费者线程缓冲区中有项目,消费者醒来并获取项目。简单地说,生产者锁定互斥锁,将某些内容放入缓冲区,通知消费者。消费者锁定互斥锁,在等待条件时休眠,当缓冲区中有内容时醒来并从缓冲区中获取内容。这是一种更简单和更高效的解决方案。
std::condition_variable::notify_one
和pthread_cond_signal
的文档)。 - Maxim Egorushkin