无法在 Boost 线程中使用 message_queue 接收消息
Posted
技术标签:
【中文标题】无法在 Boost 线程中使用 message_queue 接收消息【英文标题】:Unable to receive a message using message_queue in Boost thread 【发布时间】: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 我的错。
【参考方案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();
【讨论】:
ThreadFunc 是我的错。仅它的线程函数。在 RecieveMsg 中,实际上我想要实现的是,线程总是在收到消息后立即等待它做一些它应该做的事情。我现在不太确定我是否正在采用正确的方法。 由于上述原因,您的方法毫无意义。创建一个新线程并立即加入它是没有用的。 感谢您的意见,我会处理您提到的问题,并希望能以另一种澄清的方法回来。以上是关于无法在 Boost 线程中使用 message_queue 接收消息的主要内容,如果未能解决你的问题,请参考以下文章