go がオーディオ/ビデオ アプリケーションの可能なオプションであるかどうかを評価するために、go でのメッセージ パッシングが、ブロックされない進行の保証 (障害がない、ロックがない、または待機がない) を満たしているかどうかを知りたいです。特に、次のシナリオが該当します。
シングル プロデューサー シングル コンシューマー:
2 つのスレッドが共有チャネルを使用して通信します。スレッド A は非同期送信のみを行い、スレッド B は非同期受信のみを行います。OS スケジューラーがスレッド A を「考えられる最悪の瞬間」に無期限に中断することを決定したとします。スレッド B は、制限された数の CPU サイクルで受信操作を完了することが保証されていますか、それともスレッド A が OS がスレッド A を再開するのを待つ必要がある状態にスレッド A がチャネルを入れることができる (理論的な) 可能性はありますか?
複数のプロデューサー:
いくつかのスレッド A1、A2、A3、... は、共有チャネルを使用して 1 つ以上の他のスレッドと通信します。スレッド Ai は非同期送信のみを行います。A2、A3、... が OS スケジューラによって「考えられる最悪の瞬間」に無期限に中断されたとします。スレッド A1 は、限られた数の CPU サイクルで送信操作を完了することが保証されていますか? さらに、各スレッドが 1 つの送信だけを行いたいとします。プログラムが十分に長く実行された場合 (一部のスレッドを枯渇させる可能性があるか、「最悪の瞬間」にスレッドを中断して再開する「悪意のある」スケジューラを使用)、少なくとも 1 つの送信が成功することが保証されますか?
ここでは、典型的なシナリオにはあまり関心がありませんが、最悪の場合の保証には関心があります。障害、ロック、待機のないアルゴリズムの詳細については、ノンブロッキング アルゴリズム (ウィキペディア) を参照してください。