Boostライブラリのメッセージキューについて説明する



Explain Message Queue Boost Library



https://www.cnblogs.com/ltm5180/p/4334522.html

メッセージキュー(以下、MQまたはメッセージキューと略します)は、プロセス間通信をカプセル化するために使用されるブーストライブラリの実装です。同じマシン上のプロセスまたはスレッドは、メッセージキューを介して通信できます。メッセージキュー内のメッセージは、優先度、メッセージ長、およびメッセージデータの3つの部分で構成されます。ここで注意する必要があるのは、MQは単にメモリに送信するデータをコピーするだけなので、複雑な構造やオブジェクトを送信するときは、シリアル化してから送信する必要があり、レシーバーは受信時にデシリアル化する必要があります。つまり、メッセージ(つまり、カスタムネットワーク通信プロトコル)を定義する必要があります。 MQでは、次の3つのモードを使用してメッセージを送受信できます。



  1. ブロッキング:メッセージが送信されるときに、メッセージキューがいっぱいになると、キューがいっぱいになるまで送信インターフェイスがブロックされます。メッセージを受信するときに、キューが空の場合、受信インターフェイスもキューが空でなくなるまでブロックします。
  2. タイムアウト:ユーザーはタイムアウト期間をカスタマイズできます。タイムアウトが経過すると、キューがいっぱいであるか空であるかに関係なく、送信インターフェイスまたは受信インターフェイスが戻ります。
  3. 試してください:キューが空または満杯になるとすぐに戻ることができます

MQは、名前付き共有メモリを使用してプロセス間通信を実装します。つまり、ユーザーは名前を指定して共有メモリを作成し、ファイルのように共有メモリを開くことができます。同様に、他のプロセスは名前に従って共有メモリを開くことができます。 1つのプロセスは共有メモリに書き込み、別のプロセスは共有メモリから読み取ることができます。ここでの2つのプロセスの読み取りと書き込みには、同期の問題が含まれます。さらに、MQを作成するときに、MQのメッセージの最大数とメッセージの最大サイズを指定する必要があります。

  1. // message_queueを作成します。キューの場合
  2. // existsは例外をスローします
  3. message_queue mq
  4. (create_only //作成のみ
  5. 、 'message_queue' //名前
  6. 、100 //最大メッセージ数
  7. 、100 //最大メッセージサイズ
  8. )。
  9. boost :: interprocessを使用する
  10. // message_queueを作成または開きます。キューの場合
  11. //存在しない場合は作成され、それ以外の場合は開きます。
  12. //キューの場合、メッセージの番号とサイズは無視されます
  13. //開かれます
  14. message_queue mq
  15. (open_or_create //開くまたは作成する
  16. 、 'message_queue' //名前
  17. 、100 //最大メッセージ数
  18. 、100 //最大メッセージサイズ
  19. )。
  20. boost :: interprocessを使用する
  21. // message_queueを開きます。キューの場合
  22. //存在しない場合は例外がスローされます。
  23. message_queue mq
  24. (open_only //開くだけ
  25. 、 'message_queue' //名前
  26. )。

message_queue :: remove( 'message_queue')を使用して、指定したメッセージキューを削除します。



次に、メッセージキューを使用するプロデューサーとメッセージ送信者の例を見てみましょう。最初のプロセスはプロデューサーであり、2番目のプロセスはコンシューマーです。

プロデューサープロセス:

[cpp] プレーンビュー コピー 印刷



  1. #include
  2. #include
  3. #include
  4. 名前空間boost :: interprocessを使用する
  5. int main()
  6. {{
  7. 試してみてください{
  8. //前のメッセージキューを消去します
  9. message_queue :: remove( 'message_queue')
  10. // message_queueを作成します。
  11. message_queue mq
  12. (create_only //作成のみ
  13. 、 'message_queue' //名前
  14. 、100 //最大メッセージ数
  15. 、sizeof(int)//最大メッセージサイズ
  16. )。
  17. // 100個の番号を送信します
  18. for(int i = 0 i<100 ++i){
  19. mq.send(&i、sizeof(i)、0)
  20. }
  21. }
  22. catch(interprocess_exception&ex){
  23. std :: cout<< ex.what() << std::endl
  24. 戻り値1
  25. }
  26. 0を返す
  27. }
Consumer process:

[cpp] プレーンビュー コピー 印刷

  1. #include
  2. #include
  3. #include
  4. 名前空間boost :: interprocessを使用する
  5. int main()
  6. {{
  7. 試してみてください{
  8. //メッセージキューを開きます。
  9. message_queue mq
  10. (open_only //作成のみ
  11. 、 'message_queue' //名前
  12. )。
  13. unsignedint優先度
  14. message_queue :: size_type recvd_size
  15. // 100個の数字を受け取る
  16. for(int i = 0 i<100 ++i)
  17. }
  18. catch(interprocess_exception&ex){
  19. message_queue :: remove( 'message_queue')
  20. std :: cout<< ex.what() << std::endl
  21. 戻り値1
  22. }
  23. message_queue :: remove( 'message_queue')
  24. 0を返す
  25. }