12

キューは呼び出し元からの引数です。入力dispatch_queue_tのタイプ(シリアルまたは同時)を知りたいのは、それを別の方法で処理するからです。

出来ますか?それを確認する方法は?

4

2 に答える 2

16

GCD で任意の呼び出し元が提供するキューでシリアル化された実行を保証する慣用的な方法は、独自のシリアル キューを作成し、呼び出し元が提供するキューをキューのターゲット キューに設定することです (dispatch_set_target_queue(3) API を使用)。

于 2013-01-21T01:06:00.033 に答える
9

あなたが持っているのがdispatch_queue_t「他の誰か」から渡されたものだけである場合、あなたが知る方法はありません. その情報は効果的に隠されています。自分でキューを作成している場合は、 and を使用dispatch_queue_set_specificdispatch_queue_get_specificてキューのコンテキスト データに値を格納し、それを読み戻すことができますが、キューを作成していない場合は運が悪いです。

FWIW、この種の脆弱なデザイン/アンチパターンを示唆しています。パラメータとしてキューを使用することは、そのキューでの将来の実行のためにブロックをスケジュールすることを意味します。その観点から、キューが同時かシリアルかは問題ではありません。

さらに言えば、シリアルまたは同時キューで実行されるかどうかが問題にならないように、コードを記述する必要があります。共有リソースを使用する場合は、それらのリソースへのアクセスを同期して、同時キューで実行された場合にそれらのリソースへのアクセスが安全になるようにする必要があります。dispatch_sync逆に、シリアル キューでの実行が問題になるような状況は避けてください (つまり、シリアルである可能性のあるキューを使用して、再帰的なロックを達成しようとしないでください)。

于 2013-01-19T19:21:32.960 に答える