を処理するのを待つ必要がありますここではロックインを作成する方法ですC++の空きキュー:
http://www.ddj.com/hpc-high-performance-computing/210604448
しかし、あなたはそれが必要条件だと確信している、「スレッドAがブロックしてはならない」と言うとき? Windowsはリアルタイムオペレーティングシステムではありません(通常はLinuxでもありません)。スレッドAが使用可能なすべてのシステムメモリを使用できるようにするには、メモリを割り当てる必要があります(または、他の誰かが実行している間待つ必要があります)。 OS自体は、リストを操作するためにリーダとライターの両方がインプロセスロック(すなわち、非共有ミューテックス)を取った場合のものよりも優れたタイミング保証を提供することはできません。そしてメッセージを追加する最悪の場合は、メモリを取得するためにOSに行く必要があります。
要するに、あなたが好きでないキューには容量が固定されています。つまり、待ち時間の短いスレッドにメモリを割り当てる必要がないからです。
したがって、ロックフリーコードは一般的にブロック-yより少なくなりますが、メモリ割り当てのために保証されているわけではありません。ミューテックスのパフォーマンスは、本当に巨大処理するイベントのストリーム(ネットワークドライバを作成していて、メッセージは着信イーサネットパケットです)。
ので、擬似コードでは、私が試してみた最初のものは、次のようになります。私はロックフリーのためのコードを行くだろう、これはライターのスレッドで容認できない遅延を導入することを証明する場合のみ
Writer:
allocate message and fill it in
acquire lock
append node to intrusive list
signal condition variable
release lock
Reader:
for(;;)
acquire lock
for(;;)
if there's a node
remove it
break
else
wait on condition variable
endif
endfor
release lock
process message
free message
endfor
を、(私がうまくいけば適切なキューが既に存在していない限り)。
どのスレッドライブラリを使用していますか? pthreads? –
boost :: threadといくつかのビットのプラットフォーム固有のコードがここにあります –
あなたの目標は、ライタースレッドがアイテムをブロックまたはドロップすることを許可しないため、メモリが不足する可能性があります。したがって、キューの重要なサイズ制限に達すると、アイテムをドロップするか、ライタースレッドをブロックするかを決定する必要があります。さもなければ、プログラムが失敗して間接的にアイテムをドロップします:-) – mmmmmmmm