欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > C++线程安全队列

C++线程安全队列

2025/6/7 17:41:54 来源:https://blog.csdn.net/weixin_57097753/article/details/140279341  浏览:    关键词:C++线程安全队列

在 C++ 中,多线程队列(queue)的实现通常需要考虑线程安全问题,特别是在多个线程需要同时对队列进行操作时。C++ 标准库中的 std::queue 并不是线程安全的,因此我们需要引入额外的机制来确保线程安全。常用的方法是使用互斥锁(mutex)和条件变量(condition variable)。

下面是一个使用 std::queue 实现线程安全队列的示例:

#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>template <typename T>
class ThreadSafeQueue {
private:std::queue<T> queue;std::mutex mtx;std::condition_variable cv;public:void push(T value) {std::lock_guard<std::mutex> lock(mtx);queue.push(value);cv.notify_one(); // 通知一个等待线程}T pop() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [this]() { return !queue.empty(); }); // 等待队列非空T value = queue.front();queue.pop();return value;}bool empty() {std::lock_guard<std::mutex> lock(mtx);return queue.empty();}
};void producer(ThreadSafeQueue<int>& tsq) {for (int i = 0; i < 10; ++i) {std::cout << "Producing: " << i << std::endl;tsq.push(i);std::this_thread::sleep_for(std::chrono::milliseconds(100));}
}void consumer(ThreadSafeQueue<int>& tsq) {for (int i = 0; i < 10; ++i) {int value = tsq.pop();std::cout << "Consuming: " << value << std::endl;}
}int main() {ThreadSafeQueue<int> tsq;std::thread prod_thread(producer, std::ref(tsq));std::thread cons_thread(consumer, std::ref(tsq));prod_thread.join();cons_thread.join();return 0;
}

在这个示例中,我们定义了一个模板类 ThreadSafeQueue,它使用 std::queue 作为基础容器,并通过 std::mutexstd::condition_variable 实现了线程安全的 pushpop 操作。

  • push 方法向队列中添加元素,并通知一个等待的线程。
  • pop 方法从队列中取出元素,如果队列为空,则等待直到有元素被添加进来。
  • empty 方法检查队列是否为空。

main 函数中,我们创建了两个线程:一个生产者线程(producer),它负责向队列中添加元素;一个消费者线程(consumer),它负责从队列中取出元素。通过互斥锁和条件变量,我们确保了这些操作的线程安全性。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词