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技术站