gpt4 book ai didi

c++ - 无法在 Boost 线程中使用 message_queue 接收消息

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:21:21 26 4
gpt4 key购买 nike

我需要创建一个基于事件的多线程应用程序,为此我尝试使用 boost::thread 和 boost/interprocess/ipc/message_queue 在线程之间发送消息。我目前正在做的是让线程在其工作函数中等待以等待消息。实际上这只是基本的开始,发送者和接收者都是同一个线程,在后期我想存储一个 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 函数进入,然后代码崩溃。请指导我做错了什么,如果方法完全错误,我愿意转向新方法。

附言这是我关于堆栈溢出的第一个问题,我仍然尝试遵循指南,如果我偏离了任何地方,请纠正。

最佳答案

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();
}

关于c++ - 无法在 Boost 线程中使用 message_queue 接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25790178/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com