【问题标题】:Unable to receive a message using message_queue in Boost thread无法在 Boost 线程中使用 message_queue 接收消息
【发布时间】: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 我的错。

标签: c++ multithreading boost boost-thread boost-interprocess


【解决方案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 中,实际上我想要实现的是,线程总是在收到消息后立即等待它做一些它应该做的事情。我现在不太确定我是否正在采用正确的方法。
  • 由于上述原因,您的方法毫无意义。创建一个新线程并立即加入它是没有用的。
  • 感谢您的意见,我会处理您提到的问题,并希望能以另一种澄清的方法回来。
猜你喜欢
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2017-04-05
  • 2017-06-18
  • 2023-03-06
  • 2019-08-21
  • 2015-04-22
  • 1970-01-01
相关资源
最近更新 更多