2011-10-21 4 views
2

POSIX 메시지 큐를 통해 클래스 개체 포인터를 올 바르고 안전하게 전달할 수 있습니까? 예를 들어Pack Class Object 메시지 큐의 char * 포인터

,

Object *obj = new Object(); 

mq_send(mqdes, static_cast<char*>&obj, sizeof(obj), 1); 

과 수신 측에

, 내 Objectreinterpret_cast을 다시 수행?

메시지 대기열은 Linux에서 파일 설명자를 사용하므로이 기능이 어떻게 작동하는지 궁금합니다. 나는 그것을 실패로 시도했지만 내가 뭔가 잘못하고 있다고 생각합니다.

답변

3

오브젝트가 기본 유형 필드 및 기본 유형 필드가있는 기타 구조체 만 포함하는 경우에만 .... 포인터를 보내면 포인터가 다른 프로세스 또는 다른 시스템에있는 경우 다른 쪽에서 재사용 할 수 없습니다.

또한 상속 및 가상 메소드가있는 클래스를 사용하면 엉망이 될 수 있습니다!

내 관점에서 일종의 Serialize 메서드를 추가하는 것이 좋습니다.

또한이 방식으로 직렬화 된 struct binary를 전달하는 것은 이식성이 전혀 없으며 다른 시스템과 동일한 메커니즘을 사용하거나 구조체 또는 객체 패킹과 같은 것을 변경하려는 경우 몇 가지 문제가 발생할 수 있습니다 .

사용자 지정 serialization 및 deserialization이 선호되고 더 많은 이식성이 있지만 선택은 물론입니다.

뭔가 같은 ...

template<typename T> 
int SerializeAndSendObject(mqd_t mqdes, const T* instance) 
{ 
    MySerializationStream stream; 
    instance->SerializeTo(stream); 
    mq_send(stream.toBuffer(), stream.size()); 
} 

당신은 단지 두 개의 스레드 사이에 보내는 대신 내가 새로 할당 된 객체에 불과 포인터를 보낼 것입니다 그리고 난에서 할당을 해제 할 객체의 컨텐츠를 전송하는 경우 반대편. 대기열을 처리 할 때 먼저 대기중인 모든 객체를 파괴해야합니다.

Object* pointer = &obj; 
mq_send(mqdes, static_cast<char*>(pointer), sizeof(Object*), 1); 

참고 sizeof (Object *) ... 포인터 만 보내야하며 개체 자체는 보내지 않아야합니다.

+0

메시지 큐가 스레드 사이에도 있더라도? –

+0

만약 당신이 대신 객체의 내용을 보내는 대신 두 개의 스레드 사이에 보내는 단지 새 개체와 할당 된 포인터를 보내겠다 나는 다른 측면에서 할당을 해제합니다. 대기열을 처리 할 때 먼저 대기중인 모든 객체를 삭제해야합니다. –

+0

내가 가진 문제는 이벤트를 대기열에 넣어야한다는 것입니다. 이러한 메시지는 mqueue를 통해 전송됩니다. –