Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

c++ 消息队列

作者:尒忸旳迣鎅゛沬卜鋽旳凄涼   发布日期:2026-03-23   浏览:63

#include <iostream>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <thread>

// 消息队列类
class MessageQueue {
public:
    // 向队列中添加消息
    void enqueue(int message) {
        std::lock_guard<std::mutex> lock(mtx); // 加锁,确保线程安全
        queue.push(message);
        cond.notify_one(); // 通知等待的线程
    }

    // 从队列中取出消息
    int dequeue() {
        std::unique_lock<std::mutex> lock(mtx); // 加锁,确保线程安全
        cond.wait(lock, [this] { return !queue.empty(); }); // 等待直到队列非空
        int message = queue.front();
        queue.pop();
        return message;
    }

private:
    std::queue<int> queue; // 存储消息的队列
    std::mutex mtx; // 互斥锁,保证线程安全
    std::condition_variable cond; // 条件变量,用于线程间的同步
};

// 生产者线程函数
void producer(MessageQueue& mq) {
    for (int i = 0; i < 10; ++i) {
        std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟生产时间
        mq.enqueue(i);
        std::cout << "Produced: " << i << std::endl;
    }
}

// 消费者线程函数
void consumer(MessageQueue& mq) {
    for (int i = 0; i < 10; ++i) {
        int message = mq.dequeue();
        std::cout << "Consumed: " << message << std::endl;
    }
}

int main() {
    MessageQueue mq;

    std::thread prod(producer, std::ref(mq));
    std::thread cons(consumer, std::ref(mq));

    prod.join();
    cons.join();

    return 0;
}

解释说明:

  1. MessageQueue 类:实现了一个线程安全的消息队列。

    • enqueue(int message):向队列中添加消息,并通知等待的消费者线程。
    • dequeue():从队列中取出消息,如果队列为空,则等待直到有消息可用。
  2. 互斥锁和条件变量

    • std::mutex:用于保护对共享资源(即队列)的访问,确保同一时刻只有一个线程可以修改队列。
    • std::condition_variable:用于在生产者和消费者之间进行同步。当队列为空时,消费者线程会等待,直到生产者线程通知有新的消息可用。
  3. 生产者和消费者线程

    • producer 函数模拟生产者线程,每隔一段时间生成一个消息并放入队列。
    • consumer 函数模拟消费者线程,从队列中取出消息并处理。
  4. main 函数:创建并启动生产者和消费者线程,最后等待它们完成。

这个示例展示了如何使用 C++ 实现一个简单的线程安全的消息队列,并通过生产者-消费者模式来演示其工作原理。

上一篇:c++中char的用法

下一篇:递归函数c++简单实例

大家都在看

c++闭包

c++向上取整的代码

c++单引号和双引号的区别

c++ 注释

c++如何判断素数

c++ functional

c++框架代码

c++格式化字符串

c++ orm框架

c++ string类

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站