2014-09-11 4 views
2

스레드 간 메시지 전송을 위해 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. 이것은 스택 오버플로에 대한 나의 첫 번째 질문이다. 나는 지침을 따르려고 노력했다.

+0

읽을 수 있도록 코드를 올바르게 들여 쓰기해야합니다. 코드를 붙여 넣은 다음 강조 표시하고 Ctrl-K (또는 {아이콘)을 사용하여 전체 블록을 일관되게 들여 쓰기 할 수 있습니다. 어쨌든,'threadfunc'는 무엇입니까? 왜 인자를'XYZ :: ThreadFunc'에'XYZ * '대신'void *'로 넘겨 줍니까? –

+0

@JonathanWakely - ThreadFunc는 작성된 workerthread가 실행될 때 실행을 시작하는 함수입니다. 여기에서 - 부스트 : 스레드 workerthread (threadfunc, this). 솔직히 말해서 void *가 예제 다음에 전달되었고 나중에 ThreadFunc가 정적 멤버 함수이므로 다른 멤버 함수에 액세스하기 위해 나중에이를 XYZ *로 캐스팅했습니다. – Hummingbird

+0

'ThreadFunc'가 무엇인지 묻지 않고,'ThreadFunc'가'Create'에서 사용하는 것이 무엇인지 물었습니다. C++에서'threadfunc'는'ThreadFunc'와 같지 않습니다. 말도 안되는 코드로 질문하지 않으면 모든 사람의 시간을 낭비합니다. 실제로 컴파일되는 코드를 붙여 넣거나 질문을 닫습니다. –

답변

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

ThreadFunc는 제 잘못입니다. 그것의 threadfunc 만. 그리고 RecieveMsg 실제로 달성하기 위해 노력하고 있어요 그것은 스레드가 메시지가 수신되는 즉시 항상 기다리고있는 것입니다. 나는 지금 당장 습관성이 있는지 아닌지, 나는 올바른 접근 방식을 취하고있다. – Hummingbird

+0

위의 이유로 인해 접근법이 틀립니다. 새로운 쓰레드를 생성하고 바로 쓰는 것은 쓸모가 없다. –

+0

입력 해 주셔서 감사합니다. 귀하가 언급 한 요점에 대해 작업하고 희망적으로 다른 명확한 접근 방식으로 되돌아 갈 수 있습니다. – Hummingbird