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日

相关文章

  • C++卸载程序功能示例

    C++ 卸载程序功能示例 在本篇中,我将分享如何实现 C++ 卸载程序功能,以及两个示例说明。 概述 卸载程序是一种用于卸载已安装程序的工具,在用户需要删除一个程序时,可以通过卸载程序的功能彻底卸载这个程序及其相关文件、注册表信息等,从而保证系统的稳定性和安全性。 在 C++ 中,我们可以通过使用 system 函数调用操作系统自带的卸载程序实现这一功能。 …

    C 2023年5月23日
    00
  • MySQL系列之开篇 MySQL关系型数据库基础概念

    MySQL系列之开篇 MySQL关系型数据库基础概念 什么是关系型数据库? 关系型数据库是最为常见的数据库类型,它使用了表格来存储数据,每个表格都有一个唯一的名字,并且由一个或多个列组成。 在关系型数据库中,表格之间可以相互关联,从而形成一个关系型的数据模型。 关系型数据库的优点 简单易学,广泛使用。 数据之间的关系清晰。 可靠性、稳定性好。 支持事务处理,…

    C 2023年5月22日
    00
  • C语言超全面讲解函数的使用方法下

    C语言超全面讲解函数的使用方法下 简介 函数是C语言中重要的组成部分,它可以将代码分解成小的模块,提高代码的可维护性,也可以提高代码的可重用性。在本攻略中,我们将全面讲解C语言中函数的使用方法,包括函数定义、函数调用、函数参数、函数返回值等方面。 函数定义 函数定义包括函数头和函数体两部分。函数头一般包括函数的返回值类型、函数名和函数参数。如下所示: int…

    C 2023年5月24日
    00
  • C 存储类

    C 语言中的存储类指的是控制变量存储方式和生命周期的关键字。局部变量、全局变量和静态变量等都可以使用存储类关键字进行控制,以达到更加灵活的变量存储方式和更加符合实际需要的生命周期等效果。通常使用的存储类关键字有 auto、register、static、extern 四种。 下面我们来详细介绍一下“C 存储类”的使用攻略。 auto 存储类 auto 存储类…

    C 2023年5月10日
    00
  • c语言stack(栈)和heap(堆)的使用详解

    C语言 Stack 和 Heap 的使用详解 在C语言中,stack和heap是两种管理内存的方式。了解这两种内存分配的优缺点以及它们的使用方法可以给我们的程序设计带来很多好处。本文将详细讲解stack和heap的用法。 Stack 内存管理 Stack内存管理的定义 Stack是由编译器自动分配和管理的内存区域,其大小可在编译期确定。栈是一种先进后出(LI…

    C 2023年5月23日
    00
  • c++编写简单的计算器程序

    下面是“C++编写简单的计算器程序”的攻略: 1. 需求分析 在开始编写程序之前,需要先确定程序的需求,即需要实现哪些功能。对于一个简单的计算器程序来讲,它需要实现以下功能: 接收用户输入的两个数字 接收用户输入的运算符 根据用户输入的运算符进行计算,并输出结果 2. 代码实现 接下来,我们开始编写代码。为了方便起见,我们将代码分为以下几个步骤: 2.1 接…

    C 2023年5月23日
    00
  • C语言代码实现简单三子棋游戏

    C语言代码实现简单三子棋游戏 简介 三子棋是一种经典的策略游戏,在游戏中两位玩家轮流放置棋子,直到有一方在棋盘上形成连续的三枚棋子为止。由于其简单而有趣,常被用于讲解人工智能、算法等知识点。本文将介绍如何使用C语言编写一个简单的三子棋游戏。 准备工作 在开始编码前,需要先准备好C语言的开发环境。推荐使用Visual Studio Code和MinGW来进行开…

    C 2023年5月23日
    00
  • C语言 详细讲解接续符和转义符的使用

    C语言 详细讲解接续符和转义符的使用 在C语言中,接续符(\\)和转义符(\)是常用的符号。本文将详细讲解其使用。 接续符的使用 接续符是用于让一行代码换行继续写的符号,可以避免一行代码过长而难以阅读。其语法为 \,使用方式如下: // 例1:用于字符串常量中换行 char str[] = "这是一个比较长的\n字符串"; // 例2:用…

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