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日

相关文章

  • VsCode安装和配置c/c++环境小白教程(图文)

    下面我将为您详细讲解“VsCode安装和配置c/c++环境小白教程(图文)”的完整攻略。 VsCode安装和配置c/c++环境小白教程(图文) 1. VsCode安装 首先,你需要在官方网站下载并安装最新版本的VsCode,并按照向导一步一步进行安装。 2. 配置c/c++环境 在VsCode中,我们需要安装一些插件和配置一些环境变量来使得c/c++代码可以…

    C 2023年5月23日
    00
  • vue和react中关于插槽详解

    当我们在使用Vue或React构建组件时,经常会遇到需要给组件传递内容的情况。比如一个弹出框,需要在内容区域中传递不同的文本、表单或者其他组件作为content。这时候,我们可以使用插槽的概念来进行解决。 概述 插槽(Slot)是Vue和React中组件通信的一种技术,它允许我们在一个组件的模板中预留一定的位置,然后在使用该组件的父组件中,使用自定义的内容来…

    C 2023年5月23日
    00
  • C++调用C#的DLL程序实现方法

    C++调用C#的DLL程序实现方法,主要分为两个步骤,一是在C#中编写DLL类库文件,二是在C++中使用DllImport函数调用C#的DLL程序。下面进行详细说明。 编写C#的DLL类库文件 在C#中编写DLL类库文件的步骤如下: 新建C# Class Library项目,编写需要导出的类和方法,例如下面的代码: using System; using S…

    C 2023年5月23日
    00
  • VSCode launch.json配置详细教程

    首先,我们需要了解什么是VSCode的launch.json文件。launch.json是配置VSCode调试器的文件,在这个文件中,我们可以设置如何运行我们的代码、哪些文件需要调试、以及如何传递命令行参数等等。 接下来,让我们通过以下步骤创建一个新的launch.json文件: 在VSCode中打开你的项目文件夹。 打开调试器工具栏。(快捷键F5) 在工具…

    C 2023年5月23日
    00
  • 浅析VSCode tasks.json中的各种替换变量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等

    关于VSCode tasks.json中的各种替换变量,我整理了如下攻略: 一、什么是tasks.json tasks.json是Visual Studio Code中用来指定任务的一个配置文件,可以用来运行一些自定义的构建、测试、调试等任务。在这个配置文件中,可以指定任务的执行命令,参数,以及一些特定的配置项。 二、tasks.json中的替换变量 在指定…

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

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

    C 2023年5月24日
    00
  • Gin框架之参数绑定的实现

    Gin框架之参数绑定的实现 1. 参数绑定 在Gin框架中,我们可以通过Context结构体中的方法Bind方法来进行参数绑定。Bind方法提供的参数绑定能力非常强大,支持多种类型的参数绑定,例如querystring参数、form参数、json格式参数、xml格式参数等。 2. 示例 2.1 绑定querystring参数 package main imp…

    C 2023年5月23日
    00
  • C语言实现数独游戏

    C语言实现数独游戏攻略 介绍 数独是一种逻辑填数游戏,通过在九宫格中填入数字1-9,使得每行、每列、每个九宫格内的数字都没有重复。C语言可以实现数独游戏,并对玩家的答案进行检测。 步骤 1. 定义九宫格 首先需要定义一个二维数组来表示数独的九宫格。在C语言中,可以使用如下代码定义一个9×9的九宫格: int grid[9][9]; 2. 初始化九宫格 在定义…

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