GCDディスパッチソースとselect()の違いは何ですか?
-
10-10-2019 - |
質問
既存のいくつかを置き換えるコードを書いています:
while(runEventLoop){
if(select(openSockets, readFDS, writeFDS, errFDS, timeout) > 0){
// check file descriptors for activity and dispatch events based on same
}
}
ソケット読み取りコード。これを変更してGCDキューを使用して、「次のイテレーションで呼び出される必要がある」アレイを維持する代わりに、Dispatch_asyncを使用してキューにイベントをポップできるようにしたいと思います。また、私はすでにGCDキューを使用して /この特定のアクションを封じ込めているため、より自然なGCDディスパッチフォームに委ねたいと考えています。 (しばらくない()シリアルキューを独占するループ)
ただし、これをリファクタリングしようとしたとき、Dispatch_Source_Type_ReadおよびDispatch_Source_The_Type_Writeに結び付けられたイベントハンドラーから発射されたディスパッチソースに依存しているフォームに、このスケジューリングに依存していたライブラリコードが動作を停止しました。私の最初の仮定は、Dispatch_source_type_readとdispatch_source_type_writeの使用を誤解していることです - 私はそれらがそれらのソケット記述子でselect()を呼び出すのとほぼ同じ動作をもたらすと仮定していました。
GCDディスパッチソースを誤解していますか?または、リファクタルに関しては、私はそれが最適ではない状況でそれを使用していますか?
解決
あなたの質問に対する短い答えは、なしです。違いはありません。GCDディスパッチソースの両方と select()
同じことをしてください。特定のカーネルイベントが発生したこと、または特定の条件が当てはまることをユーザーに通知します。
MacまたはiOSデバイスでは使用しないでください select()
, 、むしろより高度です kqueue()
と kevent()
(また kevent64()
).
コードを確実に変換してGCDディスパッチソースを使用する場合がありますが、これに依存して他のコードを破らないように注意する必要があります。したがって、これには、コード処理信号、ファイル記述子、ソケット、その他すべての低レベルカーネルイベントを完全に検査する必要があります。
より簡単なソリューションである可能性があります。元のコードを維持することで、イベントに反応する部品にGCDコードを追加するだけです。ここでは、特定のタイプのイベントに応じて、異なるキューでイベントを派遣します。