【发布时间】:2014-09-11 14:31:02
【问题描述】:
我需要创建一个基于事件的多线程应用程序,我正在尝试使用 boost::thread 和 boost/interprocess/ipc/message_queue 在线程之间发送消息。 我目前正在做的是让线程在其workerfunction中等待等待消息。 实际上,这只是为了基本的开始,其中发送者和接收者都是同一个线程,在稍后阶段,我考虑存储每个线程对应的 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 中等待,但我没有收到任何消息,并且打印到 Send 函数进入并且代码崩溃。 请指导我做错了什么,如果方法完全错误,我愿意转向新方法。
附:这是我关于堆栈溢出的第一个问题,如果我在任何地方迷路,我仍然尝试遵循指导方针,请纠正。
【问题讨论】:
-
您应该正确缩进代码,使其可读。您可以粘贴代码然后突出显示它并使用 Ctrl-K(或 {} 图标)一致地缩进整个块。无论如何,
threadfunc是什么?为什么将参数传递给XYZ::ThreadFunc为void*而不是XYZ*? -
@JonathanWakely - ThreadFunc 是创建的工作线程在创建时开始执行的函数。从这里 - boost:thread workerthread(threadfunc,this)。老实说 void * ,只是按照一个例子传递的,后来我将它转换为 XYZ* 以访问其他成员函数,因为 ThreadFunc 是一个静态成员函数。
-
我没有问
ThreadFunc是什么,我问的是threadfunc是什么,你在Create中使用。在 C++ 中,threadfunc与ThreadFunc不同。请不要用无意义的代码提问,浪费大家的时间。粘贴实际编译的代码,否则问题将被关闭。 -
@JonathanWakely 我的错。
标签: c++ multithreading boost boost-thread boost-interprocess