首页 > 解决方案 > 简单的互斥保护队列与 C++ 中的线程安全队列

问题描述

我想在我的程序中使用一个简单的线程安全 std::queue,它有多个线程访问同一个队列。我想到的第一件事是使用互斥锁保护队列操作,如下所示:

/*Enqueue*/
mutex.lock();
queue.push();
mutex.unlock();

/*Dequeue*/
mutex.lock();
val = queue.front
mutex.unlock();
/*some operation*/
mutex.pop();

我已经看到许多使用条件变量进行线程安全队列实现的强大实现,例如https://stackoverflow.com/a/16075550/3598205。如果我只有两个线程访问同一个队列,性能会有显着差异吗?

标签: c++c++11

解决方案


互斥锁和条件变量做两种不同的事情,尽管它们经常一起使用。

要确保一次只有一个线程可以访问资源,请使用互斥锁。您发布的代码显示了一个示例。

要阻塞一个工作线程直到它有事情要做,让它等待一个条件变量(然后由另一个提供某种工作项的线程发出信号)。在cppreference有一个例子。

编写多线程代码时,您的第一个想法应该是编写健壮、安全的代码。很容易出错,特别是如果您是该领域的新手,而且错误很难诊断,因为它们会导致零星的、不可预测的错误。以后担心性能。


推荐阅读