C++多线程共享队列
时间: 2023-07-28 14:10:00 浏览: 108
在 C++ 中实现多线程共享队列可以使用标准库中的 std::queue 和 std::mutex 来实现。具体实现步骤如下:
1. 定义一个模板类,用于表示队列中的元素类型;
2. 在队列类中定义两个 std::queue 成员变量,一个用于存储任务,另一个用于存储等待的线程;
3. 定义一个 std::mutex 对象,用于保护队列的数据;
4. 在队列类中定义 push() 和 pop() 函数,这两个函数需要使用 std::lock_guard<std::mutex> 对象来保护队列的数据;
5. 在 push() 函数中向任务队列中添加任务,并通知等待的线程有新任务加入;
6. 在 pop() 函数中从任务队列中取出一个任务并返回,如果队列为空则等待新任务的到来。
下面是一个简单的多线程共享队列的实现:
```c++
#include <queue>
#include <mutex>
#include <condition_variable>
template<typename T>
class ThreadSafeQueue {
public:
ThreadSafeQueue() = default;
void push(const T& value) {
std::lock_guard<std::mutex> lock(m_mutex);
m_queue.push(value);
m_condition.notify_one();
}
bool pop(T& value) {
std::unique_lock<std::mutex> lock(m_mutex);
m_condition.wait(lock, [this]{ return !m_queue.empty(); });
if (m_queue.empty()) {
return false;
}
value = m_queue.front();
m_queue.pop();
return true;
}
private:
std::queue<T> m_queue;
mutable std::mutex m_mutex;
std::condition_variable m_condition;
};
```
在上面的代码中,我们使用 std::unique_lock<std::mutex> 来保护队列的数据,并使用 std::condition_variable 来通知等待的线程有新任务加入。在 push() 函数中,我们先获取 std::lock_guard<std::mutex> 对象来保护队列的数据,然后向任务队列中添加任务,并通过 m_condition.notify_one() 通知等待的线程有新任务加入。在 pop() 函数中,我们获取 std::unique_lock<std::mutex> 对象来保护队列的数据,并通过 m_condition.wait() 等待新任务的到来。如果队列中有任务,则取出一个任务并返回,否则返回 false。
阅读全文
相关推荐














