我需要创建一个基于事件的多线程应用程序,我试图使用boost :: thread和boost / interprocess / ipc / message_queue在线程之间发送消息。 我目前正在做的是让线程在其worker函数中等待等待消息。 实际上这只是基本的开始,其中发送者和接收者都是同一个线程,在以后的阶段我想到存储一个对应每个线程的message_queue列表,然后相应地获取它或类似的东西。 但现在,按照下面的代码我正在使用
//in a common class
typedef struct s_Request{
int id;
}st_Request;
//in thread(XYZ) class
st_Request dataone;
message_queue *mq;
void XYZ::threadfunc(void *ptr)
{
XYZ*obj = (XYZ*) ptr;
obj->RecieveMsg();
}
void XYZ::RecieveMsg()
{
message_queue mq1(open_only,"message_queue");
if(!(mq1.try_receive(&dataone, sizeof(st_Request), recvd_size, priority)))
printf("msg not received");
printf("id = %d",dataone.id);
}
void XYZ::Create()
{
mq= new message_queue(open_or_create,"message_queue",100,sizeof(st_Request));
boost:thread workerthread(threadfunc,this);
workerthread.join();
}
void XYZ::Send(st_Request *data)
{
if (!(mq->try_send(data, sizeof(st_Request), 0)))
printf("message sending failed");
}
//I am calling it like
class ABC: public XYZ
{
..some functions to do stuff... };
void ABC::createMSGQ()
{
create();
st_Request *data;
data->id =10;
send(data);
}
我的线程正在RecieveMsg中等待,但我没有得到任何消息,并且打印件一直到发送函数入口而不是代码崩溃。 请指导我做错了什么,如果方法完全错误,我愿意采用新方法。
P.S。这是我关于堆栈溢出的第一个问题我尝试遵循指南仍然如果我偏离任何地方请做正确。
答案 0 :(得分:1)
st_Request *data;
data->id =10;
data
未初始化,您无法取消引用它。在你取消引用它们之前,指针应指向某个东西。
我不明白这个功能的重点:
void XYZ::Create()
{
mq= new message_queue(open_or_create,"message_queue",100,sizeof(st_Request));
boost:thread workerthread(threadfunc,this);
workerthread.join();
}
您创建一个新线程,然后阻止并等待它完成,以便您可以加入它。为什么不在这里做工作,而不是创建一个新线程并等待它完成?
什么是threadfunc
?你的意思是ThreadFunc
?
这个函数写的很奇怪:
void XYZ::ThreadFunc(void *ptr)
{
XYZ*obj = (XYZ*) ptr;
obj->RecieveMsg();
}
为什么不将参数作为XYZ*
而不是void*
传递? Boost.Thread并不要求所有内容都以void*
的形式传递。那个函数是static
吗?它不需要:
struct XYZ {
void threadFunc();
void create();
void recv();
};
void XYZ::threadFunc()
{
recv();
}
void XYZ::create()
{
boost::thread thr(&XYZ::threadFunc, this);
thr.join();
}