【发布时间】:2014-09-04 03:26:18
【问题描述】:
Boost 消息队列可以处理的最大大小是多少?
当我使用 Boost 二进制序列化发送和接收以下结构时,它工作正常。
typedef struct {
int msg_type;
char msg_name[100];
union {
struct {
int ID;
std::string ReportedTime;
char ReceivedAt[200];
int Number;
int Priority;
} mess1;
struct {
char host_ip[20];
char mac_addr[30];
char time_stamp[100];
} mess2;
} struct_type;
}msg_struct;
#include <boost/serialization/is_bitwise_serializable.hpp>
BOOST_IS_BITWISE_SERIALIZABLE(msg_struct)
但是当我将ReceivedAt[2000] 的大小设置为 2000 或添加一个新的 char 数组变量时。
它抛出以下异常并且核心被转储。
terminate called after throwing an instance of 'boost::interprocess::interprocess_exception'
what(): boost::interprocess_exception::library_error
Aborted (core dumped)
编辑
发送
int ControlQueue::pushMessage(msg_struct* msg)
{
int q_size = vamsgq->get_num_msg();
int retVal = 0;
lockQueue();
//imp->ID=1;
//strcpy(imp->ReceivedAt,"10-07-14");
std::stringstream oss;
boost::archive::binary_oarchive oa(oss);
strncpy(msg->msg_name,"msg_name",sizeof(msg->msg_name));
oa << boost::serialization::make_array(msg, 1);
std::string serialized_string(oss.str());
vamsgq->send(serialized_string.data(), serialized_string.size(), 0);
std::cout <<"\n sendig type="<< msg->msg_name << std::endl;
if((retVal = pthread_cond_signal(&m_qCondSignal)) != 0)
{
cout<<__FILE__<<__LINE__<<
"{ControlQueue %x} Unable to send Cond Signal",this);
}
unlockQueue();
return 1;
}
收到:
msg_struct* ControlQueue::getMsg()
{
int retVal = 0;
message_queue::size_type recvd_size;
unsigned int priority;
lockQueue();
while(vamsgq->get_num_msg()==0)
{
if((retVal = pthread_cond_wait(&m_qCondSignal, &m_qMutex)) != 0)
{
cout<<__FILE__<<__LINE__<<"getMsg {ControlQueue } Unable to Cond Signal";
unlockQueue();
return NULL;
}
}
msg_struct *l_msg_struct = NULL;
if(vamsgq->get_num_msg())
{
l_msg_struct=new msg_struct();
std::stringstream iss;
std::string serialized_string;
serialized_string.resize(MAX_SIZE);
vamsgq->receive(&serialized_string[0], MAX_SIZE, recvd_size, priority);
iss << serialized_string;
boost::archive::binary_iarchive ia(iss);
ia >> boost::serialization::make_array(l_msg_struct, 1);
std::cout <<"Recieving="<< l_msg_struct->msg_name << std::endl;
}
else
{
cout<<__FILE__<<__LINE__<<"getMsg {ControlQueue } m_MsgQ empty..";
}
unlockQueue();
return l_msg_struct;
}
发送和接收都在不同的线程中运行,我得到的唯一问题是在增加结构的大小或添加 char 数组变量之后。
vamsgq->send() 方法抛出异常,创建方法(消息队列)工作正常。而且我还在增加消息队列要存储的消息的大小。
是否有任何关于 boost::message_queue 的完整在线文档。
【问题讨论】:
-
你能发布一个最小的 SSCCE 吗?我们无法从心理上获取异常信息。您将不得不处理异常或在抛出站点跟踪程序流/断点以查看失败的位置。
-
@sehe 谢谢。我认为它正在发生,因为我正在使用两个并行工作的线程,一个用于发送,一个用于接收,IPC 用于进程间通信。但我正在使用适当的侦听器来激活线程 2 来读取。它适用于小数据结构。
标签: c++ boost message-queue