C++ 中消息队列函数实例详解

C++中的消息队列(Message Queue)是一种在多线程编程中极为实用的技术,可以用于在不同线程之间传递信息和数据。C++标准库中提供了一些消息队列函数可以用于创建、发送和接收消息。本文将对消息队列函数进行详解。

创建消息队列

在C++中,可以使用std::queue类对象来创建一个消息队列。在使用std::queue之前需要使用包含的头文件。

#include <queue>
std::queue<int> message_queue;

上述代码创建了一个空的整型消息队列。

发送消息

可以使用std::queue的push函数将消息添加到队列尾部。示例如下:

message_queue.push(1);
message_queue.push(2);

上述代码向消息队列中添加了两个整型消息。

接收消息

可以使用std::queue的pop函数移除队列顶部的元素并返回元素的值。示例如下:

if (!message_queue.empty()) {
  int message = message_queue.front();
  message_queue.pop();
  std::cout << "Received message: " << message << std::endl;
}

上述代码从队列中移除和读取了第一个元素,如果队列为空,则不进行任何操作。

示例一

下面的示例演示如何使用消息队列在多线程之间传递和处理数据。假设有两个线程,一个线程从标准输入读取数据并将其发送到消息队列中,另一个线程则从消息队列中接收这些数据并把它们打印出来。代码实现如下:

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

const int kMaxMessageCount = 10;
std::queue<int> message_queue;
std::mutex mutex;
std::condition_variable cv;

void Producer() {
  for (int i = 0; i < kMaxMessageCount; ++i) {
    std::unique_lock<std::mutex> lock(mutex);
    int message;
    std::cout << "Enter a message: ";
    std::cin >> message;
    message_queue.push(message);
    cv.notify_one();
  }
}

void Consumer() {
  for (int i = 0; i < kMaxMessageCount; ++i) {
    std::unique_lock<std::mutex> lock(mutex);
    cv.wait(lock, [](){ return !message_queue.empty(); });
    int message = message_queue.front();
    message_queue.pop();
    std::cout << "Received message: " << message << std::endl;
  }
}

int main() {
  std::thread producer_thread(Producer);
  std::thread consumer_thread(Consumer);
  producer_thread.join();
  consumer_thread.join();
}

在上述示例中,生产者(Producer)线程从标准输入中读取数据,将数据添加到消息队列中,并通知一个等待中的线程数据已经到达。消费者(Consumer)线程等待生产者线程通知,并且在消息队列中有新的数据时将其取出并打印。该程序使用std::mutex和std::condition_variable来同步两个线程。

示例二

下面的示例演示了如何使用lambda表达式实现一个线程间的数据传递。代码实现如下:

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

std::queue<int> message_queue;
std::mutex mutex;
std::condition_variable cv;

void Producer() {
  for (int i = 0; i < 5; ++i) {
    std::unique_lock<std::mutex> lock(mutex);
    int message = i + 1;
    message_queue.push(message);
    cv.notify_one();
  }
}

void Consumer() {
  for (int i = 0; i < 5; ++i) {
    std::unique_lock<std::mutex> lock(mutex);
    cv.wait(lock, [](){ return !message_queue.empty(); });
    int message = message_queue.front();
    message_queue.pop();
    std::cout << "Received message: " << message << std::endl;
  }
}

int main() {
  std::thread producer_thread(Producer);
  std::thread consumer_thread(Consumer);
  producer_thread.join();
  consumer_thread.join();
}

在上述示例中,生产者(Producer)线程向消息队列中添加5个数据,消费者(Consumer)线程等待生产者线程通知,并且在消息队列中有新的数据时将其取出并打印。该程序使用std::mutex和std::condition_variable来同步两个线程,并使用lambda表达式定义了消费者线程的等待条件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 中消息队列函数实例详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 黑客帝国数字雨效果VC6源代码分享

    标题:黑客帝国数字雨效果VC6源代码分享 简介 黑客帝国数字雨效果是一种很有趣的效果,本篇文章将分享数字雨效果VC6源代码,这是一篇针对VC6的C++代码,可供初学者学习参考。 实现过程 我们需要在VC6中建立一个win32应用程序。 步骤一:设置窗口 首先,我们需要设置窗口的大小和标题。这个可以在WimMain函数中完成。如下所示: int WINAPI …

    C 2023年5月24日
    00
  • c++实现LinkBlockedQueue的问题

    让我们来详细讲解“c++实现LinkBlockedQueue的问题”该如何解决。 首先,我们需要阅读题目并理解其中所涉及的术语。“LinkBlockedQueue”是一个队列类,其中“Link”指的是链表,“Blocked”指的是阻塞,即队列为空时,出队操作会一直阻塞等待直到队列中有元素可出队。 接下来,我们可以通过以下步骤实现LinkBlockedQueu…

    C 2023年5月23日
    00
  • 联想拯救者笔记本开机蓝屏代码0xc000000d怎么办?

    “联想拯救者笔记本开机蓝屏代码0xc000000d”是一种常见的Windows操作系统蓝屏错误。这通常在连接USB驱动器或进行系统文件更改时发生。以下是解决此问题的完整攻略: 步骤一:重启电脑 第一步是重新启动您的电脑。有时,Windows操作系统遇到临时错误会导致蓝屏并且重启可以解决这个问题。这是一个非常简单的过程,只需点击“开始”菜单,然后点击“重新启动…

    C 2023年5月23日
    00
  • Bootstrap3使用typeahead插件实现自动补全功能

    下面会详细讲解如何使用 Bootstrap3 的 typeahead 插件来实现自动补全功能。 1. 安装 Bootstrap3 和 typeahead 插件 首先需要在网页中引入 Bootstrap3 和 typeahead 插件的文件。在 head 部分加入以下代码: <!– 引入 Bootstrap3 样式表文件 –> <link…

    C 2023年5月23日
    00
  • C语言执行程序时遇到的常见问题及解决

    C语言执行程序时遇到的常见问题及解决 C语言是一种非常流行的编程语言,但在执行程序时,常会遇到各种问题。下面我们来看一些常见问题及解决方案。 1. 编译错误 在编译程序时,我们可能会遇到各种编译错误,如语法错误、未定义的变量或函数等。解决这些错误需要仔细检查代码,并修改错误的部分。 示例: #include <stdio.h> int main(…

    C 2023年5月23日
    00
  • 详解c++ atomic原子编程中的Memory Order

    当使用C++中的原子类型进行编程时,需要指定原子操作的内存顺序(Memory Order),以保证多线程下的正确性和一致性。 C++中原子操作的内存顺序一共有4种: memory_order_relaxed:最轻松的内存顺序,不会保证原子操作的顺序,也不保证操作的内存可见性。当我们要进行仅仅是读写共享内存而无需考虑同步问题的操作时,可以使用memory_or…

    C 2023年5月23日
    00
  • 浅谈Python 中的复数问题

    浅谈Python 中的复数问题 什么是复数 在数学中,负数的出现,让数轴不再只有正方向,还有负方向。同样的,对于一些无法用实数描述的概念或者物理量(例如电阻、电容、力等),我们也需要在数轴的虚数方向上寻找答案。 虚数定义为 $\sqrt{-1}$ ,通常用字母 i 来表示。复数是实数与虚数的和,形如 $a+bi$ 的形式。 Python 中的复数 在 Pyt…

    C 2023年5月23日
    00
  • C语言实现推箱子代码

    C语言实现推箱子代码完整攻略 1. 简介 推箱子,又称”推石头游戏”,是一种经典的益智游戏。在游戏中,玩家需要推动箱子到目标位置,从而完成关卡任务。现在我们就来详细讲解如何使用C语言实现一个推箱子游戏。 2. 攻略 2.1 游戏规则 在推箱子游戏中,游戏界面通常由一个二维地图构成,地图上包含玩家、箱子、目标位置和障碍物等元素,如下所示: ####### #*…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部