Boostライブラリのメッセージキューについて説明する
Explain Message Queue Boost Library
https://www.cnblogs.com/ltm5180/p/4334522.html
メッセージキュー(以下、MQまたはメッセージキューと略します)は、プロセス間通信をカプセル化するために使用されるブーストライブラリの実装です。同じマシン上のプロセスまたはスレッドは、メッセージキューを介して通信できます。メッセージキュー内のメッセージは、優先度、メッセージ長、およびメッセージデータの3つの部分で構成されます。ここで注意する必要があるのは、MQは単にメモリに送信するデータをコピーするだけなので、複雑な構造やオブジェクトを送信するときは、シリアル化してから送信する必要があり、レシーバーは受信時にデシリアル化する必要があります。つまり、メッセージ(つまり、カスタムネットワーク通信プロトコル)を定義する必要があります。 MQでは、次の3つのモードを使用してメッセージを送受信できます。
- ブロッキング:メッセージが送信されるときに、メッセージキューがいっぱいになると、キューがいっぱいになるまで送信インターフェイスがブロックされます。メッセージを受信するときに、キューが空の場合、受信インターフェイスもキューが空でなくなるまでブロックします。
- タイムアウト:ユーザーはタイムアウト期間をカスタマイズできます。タイムアウトが経過すると、キューがいっぱいであるか空であるかに関係なく、送信インターフェイスまたは受信インターフェイスが戻ります。
- 試してください:キューが空または満杯になるとすぐに戻ることができます
MQは、名前付き共有メモリを使用してプロセス間通信を実装します。つまり、ユーザーは名前を指定して共有メモリを作成し、ファイルのように共有メモリを開くことができます。同様に、他のプロセスは名前に従って共有メモリを開くことができます。 1つのプロセスは共有メモリに書き込み、別のプロセスは共有メモリから読み取ることができます。ここでの2つのプロセスの読み取りと書き込みには、同期の問題が含まれます。さらに、MQを作成するときに、MQのメッセージの最大数とメッセージの最大サイズを指定する必要があります。
- // message_queueを作成します。キューの場合
- // existsは例外をスローします
- message_queue mq
- (create_only //作成のみ
- 、 'message_queue' //名前
- 、100 //最大メッセージ数
- 、100 //最大メッセージサイズ
- )。
- boost :: interprocessを使用する
- // message_queueを作成または開きます。キューの場合
- //存在しない場合は作成され、それ以外の場合は開きます。
- //キューの場合、メッセージの番号とサイズは無視されます
- //開かれます
- message_queue mq
- (open_or_create //開くまたは作成する
- 、 'message_queue' //名前
- 、100 //最大メッセージ数
- 、100 //最大メッセージサイズ
- )。
- boost :: interprocessを使用する
- // message_queueを開きます。キューの場合
- //存在しない場合は例外がスローされます。
- message_queue mq
- (open_only //開くだけ
- 、 'message_queue' //名前
- )。
message_queue :: remove( 'message_queue')を使用して、指定したメッセージキューを削除します。
次に、メッセージキューを使用するプロデューサーとメッセージ送信者の例を見てみましょう。最初のプロセスはプロデューサーであり、2番目のプロセスはコンシューマーです。
プロデューサープロセス:
- #include
- #include
- #include
- 名前空間boost :: interprocessを使用する
- int main()
- {{
- 試してみてください{
- //前のメッセージキューを消去します
- message_queue :: remove( 'message_queue')
- // message_queueを作成します。
- message_queue mq
- (create_only //作成のみ
- 、 'message_queue' //名前
- 、100 //最大メッセージ数
- 、sizeof(int)//最大メッセージサイズ
- )。
- // 100個の番号を送信します
- for(int i = 0 i<100 ++i){
- mq.send(&i、sizeof(i)、0)
- }
- }
- catch(interprocess_exception&ex){
- std :: cout<< ex.what() << std::endl
- 戻り値1
- }
- 0を返す
- }
Consumer process:
- #include
- #include
- #include
- 名前空間boost :: interprocessを使用する
- int main()
- {{
- 試してみてください{
- //メッセージキューを開きます。
- message_queue mq
- (open_only //作成のみ
- 、 'message_queue' //名前
- )。
- unsignedint優先度
- message_queue :: size_type recvd_size
- // 100個の数字を受け取る
- for(int i = 0 i<100 ++i)
- }
- catch(interprocess_exception&ex){
- message_queue :: remove( 'message_queue')
- std :: cout<< ex.what() << std::endl
- 戻り値1
- }
- message_queue :: remove( 'message_queue')
- 0を返す
- }