2

キューを次のように宣言すると

typedef boost::lockfree::queue<MyMessage, boost::lockfree::fixed_sized<true>> MessageQueue

つまり、複数のスレッドからキューにメッセージを投稿し、単一のスレッドからのメッセージのキューをポーリングすると、コンシューマー スレッドがロックされます。何も前に進みません。

しかし、固定サイズ プロパティを使用しない場合、つまりテンプレート パラメータを指定しないfixed_sized<true>場合、キューは正常に動作します。ただし、この場合、キューは実際にメモリの割り当て/割り当て解除を行い、ロックレス キューを使用する目的を無効にします。

したがって、私の質問は、「プロパティで設定すると、boost::lockfree::queue はシングル プロデューサー シングル コンシューマー キューになりますfixed_sized<true>か?」ということです。

私が使用する必要があるいくつかの異なるプッシュ/ポップ方法はありますか?

メモリ割り当ての解放を行わない MPMC キューが必要です。ブーストがこれを提供しない場合、使用できる他のキューはありますか??

前もって感謝します、

4

1 に答える 1

4

だから私の質問は、boost::lockfree::queue がプロパティ fixed_size で設定されている場合、シングル プロデューサー シングル コンシューマー キューになりますか?

回答: docsによると、いいえ。fixed_size<true>メンバー関数には異なるスレッド セーフがありますが、ポリシーがorであるかどうかに関係なく、ロックフリー キューを MRMW キューとして使用できますfixed_size<false>(たとえば、メンバー関数pushおよびpopはスレッド セーフです)。

議論については、OP へのコメントを参照してください。短縮版:

ドキュメントを正しく解釈すると、fixed_size<true>ポリシーは次の変更を意味します。

  • 呼び出したときpushに利用可能なキャパシティがそれ以上ない場合、 はpush失敗して を返しますfalse

  • 設定できる最大容量は、通常 2 16 -2 要素に制限されます。

  • 容量は自動的に変更されないため、ctorqueue(size_type)またはreserveメンバー関数を介して容量を手動で設定する必要があります。デフォルトの ctor は容量を に設定し0ます。(これは、 の既定の容量では0、すべてpushが失敗することを意味します。)

于 2013-08-07T12:59:38.907 に答える