无法在 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::ThreadFuncvoid* 而不是XYZ* @JonathanWakely - ThreadFunc 是创建的工作线程在创建时开始执行的函数。从这里 - boost:thread workerthread(threadfunc,this)。老实说 void * ,只是按照一个例子传递的,后来我将它转换为 XYZ* 以访问其他成员函数,因为 ThreadFunc 是一个静态成员函数。 我没有问ThreadFunc是什么,我问的是threadfunc是什么,你在Create中使用。在 C++ 中,threadfuncThreadFunc 不同。请不要用无意义的代码提问,浪费大家的时间。粘贴实际编译的代码,否则问题将被关闭。 @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 接收消息的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV、Boost 线程和多个摄像头

单线程Boost死锁

类内的Boost Thread无法访问成员变量

qt崩溃时boost线程中断

Boost asio程序在多线程上崩溃

使用 Boost 源代码的链接器错误 [关闭]