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),它负责从队列中取出元素。通过互斥锁和条件变量,我们确保了这些操作的线程安全性。

相关推荐

  1. C++线安全队列

    2024-07-10 15:30:03       12 阅读
  2. C++并发:构建线安全队列

    2024-07-10 15:30:03       17 阅读
  3. c语言多线队列实现

    2024-07-10 15:30:03       45 阅读
  4. C++多线和循环队列

    2024-07-10 15:30:03       10 阅读
  5. linux c线简单队列实现

    2024-07-10 15:30:03       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 15:30:03       4 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 15:30:03       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 15:30:03       4 阅读
  4. Python语言-面向对象

    2024-07-10 15:30:03       5 阅读

热门阅读

  1. Perl 语言开发(八):子程序和模块

    2024-07-10 15:30:03       8 阅读
  2. rpc超时时间的设置对句柄和内存的影响

    2024-07-10 15:30:03       7 阅读
  3. Github 2024-07-06 开源项目日报 Top10

    2024-07-10 15:30:03       7 阅读
  4. 华为HCIP Datacom H12-821 卷31

    2024-07-10 15:30:03       12 阅读
  5. 请写sql满足业务:找到连续登录3天以上的用户

    2024-07-10 15:30:03       10 阅读