std::queue作为消息队列来实现线程间的通信

320 阅读1分钟

在C++中,可以使用std::queue作为消息队列来实现线程间的通信。以下是一个示例,演示了如何使用std::queue作为消息队列实现线程通信:

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

std::queue<int> messageQueue; // 消息队列
std::mutex mtx; // 互斥锁
std::condition_variable cv; // 条件变量

// 生产者线程函数,向消息队列中添加消息
void producerFunction() {
    for (int i = 1; i <= 5; ++i) {
        // 创建消息
        int message = i;

        // 将消息添加到队列
        {
            std::lock_guard<std::mutex> lock(mtx);
            messageQueue.push(message);
            std::cout << "Produced message: " << message << std::endl;
        }

        // 通知等待的消费者线程
        cv.notify_one();

        // 模拟一些工作
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }
}

// 消费者线程函数,从消息队列中获取消息
void consumerFunction() {
    while (true) {
        // 等待消息队列非空
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, [] { return !messageQueue.empty(); });

        // 从队列中获取消息
        int message = messageQueue.front();
        messageQueue.pop();
        std::cout << "Consumed message: " << message << std::endl;

        // 检查是否为终止信号
        if (message == 5) {
            break;
        }
    }
}

int main() {
    // 创建生产者线程和消费者线程
    std::thread producer(producerFunction);
    std::thread consumer(consumerFunction);

    // 等待线程执行完成
    producer.join();
    consumer.join();

    return 0;
}

在这个示例中,我们使用了std::queue<int>作为消息队列来存储整数消息。生产者线程负责生成消息并将其添加到队列中,而消费者线程则负责从队列中获取消息并进行处理。为了实现线程安全,我们使用了互斥锁(std::mutex)来保护消息队列的访问,并使用条件变量(std::condition_variable)来实现生产者-消费者模式的同步。