2011-10-21 8 views
2

クラスオブジェクトポインタをPOSIXメッセージキューに適切かつ安全に渡すことは可能ですか?例えばPack Classオブジェクトメッセージキューのchar *へのポインタ

Object *obj = new Object(); 

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

と受信側で、私のObjectreinterpret_castバックを実行しますか?

メッセージキューはLinux上でファイルディスクリプタを使用するため、これはどのように動作するのでしょうか。私はそれをうまくやってみたが、何か間違っていると思う。

答えて

3

オブジェクトが基本タイプフィールドと基本タイプフィールドを持つ他の構造体のみを含む場合にのみ...ポインタを送信した場合、他のプロセスや別のシステムに存在する場合は、他の側から再利用することはできません。

また、継承と仮想メソッドのクラスを使用すると、混乱することがあります。

私の視点からは、ある種のSerializeメソッドを追加する方がよいでしょう。

また、このように直列化されたstructバイナリを渡すことは、移植性がないため、他のシステムと同じメカニズムを使用したい場合や、構造体やオブジェクトのパッキング。

シリアル化の直列化とシリアル化解除が優先され、移植性が向上しますが、その選択は当然です。

のような何か...

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

あなたはちょうど2つのスレッド間で送信する代わりに、私は新しいと割り当てられたオブジェクトへのポインタだけを送信し、私はからそれを解放しますオブジェクトの内容を送信する場合もう片側。 キューを破棄するときは、最初にすべての保留中オブジェクトを破棄しておく必要があることに注意してください。

sizeof(Object *)...オブジェクトのみではなくポインタのみを送信する必要があることに注意してください。メッセージキューがスレッド間であっても

+0

? –

+0

オブジェクトの内容を送信するのではなく、2つのスレッド間で送信するだけの場合は、newで割り当てられたオブジェクトへのポインタだけを送信し、もう一方のオブジェクトからは割り当てを解除します。キューを破棄するときには、最初に保留中のオブジェクトをすべて破棄しなければならないことに注意してください。 –

+0

私が持っている問題は、イベントをキューに入れる必要があることです。これらは、mqueue経由で送信されます –

関連する問題