스레드 간 메시지 전송을 위해 boost :: thread 및 boost/interprocess/ipc/message_queue를 사용하려고하는 이벤트 기반 멀티 스레드 응용 프로그램을 만들기위한 요구 사항이 있습니다. . 현재 내가 뭘하는지는 스레드가 메시지를 기다리는 worker 함수에서 기다리는 중입니다. 사실 이것은 발신자와 수신자가 모두 같은 스레드 인 기본적인 시작을위한 것입니다. 나중 단계에서 각 스레드에 해당하는 message_queue 목록을 저장 한 다음 그에 맞게 가져 오는 것이 좋습니다. 하지만 지금은 코드에 따라 내가 내 스레드가 RecieveMsg에서 대기하지만 난 어떤 MSG를 받고 있지 않다과 인쇄 기능 항목을 보내기까지하고 코드 충돌보다오고있다부스트 스레드에서 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);
}
을 사용하고 아래. 내가 잘못한 것을 안내해주십시오. 접근 방식이 완전히 잘못 되었다면, 나는 새로운 접근 방식으로 전환 할 수 있습니다.
p.s. 이것은 스택 오버플로에 대한 나의 첫 번째 질문이다. 나는 지침을 따르려고 노력했다.
읽을 수 있도록 코드를 올바르게 들여 쓰기해야합니다. 코드를 붙여 넣은 다음 강조 표시하고 Ctrl-K (또는 {아이콘)을 사용하여 전체 블록을 일관되게 들여 쓰기 할 수 있습니다. 어쨌든,'threadfunc'는 무엇입니까? 왜 인자를'XYZ :: ThreadFunc'에'XYZ * '대신'void *'로 넘겨 줍니까? –
@JonathanWakely - ThreadFunc는 작성된 workerthread가 실행될 때 실행을 시작하는 함수입니다. 여기에서 - 부스트 : 스레드 workerthread (threadfunc, this). 솔직히 말해서 void *가 예제 다음에 전달되었고 나중에 ThreadFunc가 정적 멤버 함수이므로 다른 멤버 함수에 액세스하기 위해 나중에이를 XYZ *로 캐스팅했습니다. – Hummingbird
'ThreadFunc'가 무엇인지 묻지 않고,'ThreadFunc'가'Create'에서 사용하는 것이 무엇인지 물었습니다. C++에서'threadfunc'는'ThreadFunc'와 같지 않습니다. 말도 안되는 코드로 질문하지 않으면 모든 사람의 시간을 낭비합니다. 실제로 컴파일되는 코드를 붙여 넣거나 질문을 닫습니다. –