まず、いくつかの背景。2 つの異なるモードのいずれかで操作したいキューが必要です。最初のモードでは、要素がキューに存在する場合は要素を取得できるようにしたいが、要素がない場合はブロックしたくない。2 番目のモードでは、キューに要素が含まれるまでブロックできるようにしたいと考えています。(各モードに特化したメカニズムを使用できることは承知していますが、いくつかの共通コードを除外したいので、両方の動作モードで同じメカニズムを使用できれば最も簡単です。)
を使用できますChanが、ドキュメントによると、isEmptyChanデッドロックの可能性があるため非推奨であるため、使用しないでください。これは私を残しますTChan。このtryReadTChan関数は、最初のモードに必要なものを正確に提供します (つまり、ブロックせずに要素が存在するかどうかを確認できます) が、何が機能するのか正確にはわかりreadTChanません。私のメンタル モデルはatomically、要素がチャネルに存在するまでブロックが再試行し続けるというものです。これは、CPU サイクルを浪費するビジー ループになることを意味します。これはreadChan、MVar がランタイム スレッド スケジューラによって理解されるため、要素が利用可能になるまでスレッドの実行を実際にブロックする (正しく理解できれば) (つまり、非 STM バージョン) とは異なります。
つまりTChan、ランタイムChanを使用readTChanすると、値が利用可能になるまで呼び出し元のスレッドをスケジュールしないほどスマートであるということですか? それとも、値が到着するまで継続的にポーリングするために多くの CPU サイクルを無駄にしますか?