boost::interprocess 进程间通信之消息队列的实现

本文介绍使用Boost库实现的进程间通信实例,通过共享内存和条件变量进行消息传递。ProcessA写入消息到共享队列,ProcessB读取消息,演示了多进程间的同步和通信机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 首先需要建立两个工程,processA, ProcessB

 

2. 写一个消息队列的类,"Condition_shared_data.hpp"


#include <boost/interprocess/detail/config_begin.hpp>
#include <boost/interprocess/sync/interprocess_mutex.hpp>
#include <boost/interprocess/sync/interprocess_condition.hpp>

struct trace_queue
{
	enum { LineSize = 100 };

	trace_queue()
		: message_in(false)
	{}

	//Mutex to protect access to the queue
	boost::interprocess::interprocess_mutex      mutex;

	//Condition to wait when the queue is empty
	boost::interprocess::interprocess_condition  cond_empty;

	//Condition to wait when the queue is full
	boost::interprocess::interprocess_condition  cond_full;

	//Items to fill
	char   items[LineSize];

	//Is there any message
	bool message_in;
};

#include <boost/interprocess/detail/config_end.hpp>

 

3. 进程A的函数,"ProcessA.cpp"


#include"stdafx.h"
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
#include<boost\thread\thread.hpp>
#include<boost\date_time\posix_time\posix_time.hpp>
#include <iostream>
#include <cstdio>
#include "Condition_shared_data.hpp"


using namespace boost::interprocess;

int main()
{

	//Erase previous shared memory and schedule erasure on exit
	struct shm_remove
	{
		shm_remove() { shared_memory_object::remove("MySharedMemory"); }
		~shm_remove() { shared_memory_object::remove("MySharedMemory"); }
	} remover;
	//<-
	(void)remover;
	//->

	//Create a shared memory object.
	shared_memory_object shm
	(create_only               //only create
		, "MySharedMemory"           //name
		, read_write                //read-write mode
	);
	try {
		//Set size
		shm.truncate(sizeof(trace_queue));

		//Map the whole shared memory in this process
		mapped_region region
		(shm                       //What to map
			, read_write //Map it as read-write
		);

		//Get the address of the mapped region
		void * addr = region.get_address();

		//Construct the shared structure in memory
		trace_queue * data = new (addr) trace_queue;

		const int NumMsg = 100;

		for (int i = 0; i < NumMsg; ++i) {
			scoped_lock<interprocess_mutex> lock(data->mutex);
			if (data->message_in) {
				data->cond_full.wait(lock);
			}
			if (i == (NumMsg - 1))
			{
				std::sprintf(data->items, "%s", "last message");
				std::cout << "last message:" << i << std::endl;
			}		
			else
			{
				std::sprintf(data->items, "%s_%d", "my_trace", i);
				std::cout << "My trace:" << i << std::endl;
				boost::this_thread::sleep(boost::posix_time::milliseconds(100));
			}


			//Notify to the other process that there is a message
			data->cond_empty.notify_one();

			//Mark message buffer as full
			data->message_in = true;
		}
	}
	catch (interprocess_exception &ex) {
		std::cout << ex.what() << std::endl;
		return 1;
	}

	getchar();
	return 0;
}

3. 进程B的函数,"ProcessB.cpp"


#include"stdafx.h"
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
#include <iostream>
#include <cstring>
#include "Condition_shared_data.hpp"

using namespace boost::interprocess;

int main()
{
	//Create a shared memory object.
	shared_memory_object shm
	(open_only							 //only create
		, "MySharedMemory"              //name
		, read_write                   //read-write mode
	);

	try 
	{
		//Map the whole shared memory in this process
		mapped_region region
		(shm                       //What to map
			, read_write //Map it as read-write
		);

		//Get the address of the mapped region
		void * addr = region.get_address();

		//Obtain a pointer to the shared structure
		trace_queue * data = static_cast<trace_queue*>(addr);

		//Print messages until the other process marks the end
		bool end_loop = false;
		do {
			scoped_lock<interprocess_mutex> lock(data->mutex);
			if (!data->message_in) 
			{
				data->cond_empty.wait(lock);
			}
			if (std::strcmp(data->items, "last message") == 0)
			{
				end_loop = true;
				std::cout << "last message !" << std::endl;
			}
			else 
			{
				//Print the message
				std::cout << "Receive the message:"<<data->items << std::endl;
				//Notify the other process that the buffer is empty
				data->message_in = false;
				data->cond_full.notify_one();
			}
		} while (!end_loop);
	}
	catch (interprocess_exception &ex) {
		std::cout << ex.what() << std::endl;
		return 1;
	}
	getchar();
	return 0;
}

 

 

同时运行两个进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值