1

iOS の pthread とディスパッチ キューの間の関連付けを見つけようとしています。たとえば、pthread_tオブジェクトが与えられた場合、関連するディスパッチ キューを特定することは可能ですか?

私はあらゆる種類の API を見てき*get_current_*()ました。それらはすべて、コンテキストを設定するために以前に使用されたキーを認識している場合、またはラベルが必要なディスパッチ キューに対応するもの*get_specific_*()を既に持っている場合にのみ役立ちます。dispatch_queue_t

私が探しているのは、すべてのディスパッチ キュー (プライベート/シリアル キュー - アプリケーション内で作成されたもの) のリストを取得することだけです。これにより、何らかの方法でdispatch_queue_tオブジェクトを取得し、それらを使用してそのアプリケーションのスレッドとの関連付けを見つけることができます。処理して名前を出力します。

EDIT(Dasの提案を考慮した後に得た解決策 - thread_info():ディスパッチキュー名を取得しました!各スレッドthread_info()を取得するために使用する必要がありました。次に、typedispatch_qaddrのコンテンツを処理し、必要に応じて に渡してラベルを取得します。ここでの秘訣は、特定の時点でスレッドがディスパッチ キューのコード ブロックを実行しているかどうかを安全な方法でチェックすることです。そうしないと、渡したオブジェクトに対して実行される内部操作によって、アプリケーションがクラッシュする可能性があります。そのため、プラットフォーム固有の API を使用して、結果のオブジェクトのコンテンツが適切なサイズであることを検証する必要がありました。dispatch_qaddruint64_t(dispatch_queue_t *)dispatch_queue_get_label()dispatch_queue_get_label()sizeof(dispatch_queue_t)dispatch_queue_t不透明タイプです。ええ、私は私が望んでいたものを見ることができてうれしいです!乾杯!\m/

4

2 に答える 2

1

一般に、スレッドとキューの間に固定された関連付けはありません。GCD はスレッドのプールを管理し、通常、どのスレッドも任意のキューからブロックを実行できます。唯一の例外は、メイン キューは常にメイン スレッドでブロックを実行し、メイン スレッドはメイン キューからのブロックのみを実行することです。

「どのキューが他のスレッドで実行されているか」を尋ねる API はありません。尋ねた直後に答えが変わる可能性があるからです。ディスパッチされたブロック内では、現在のキューを要求できるため、現在のスレッドで実行されているキューを知ることができますが、ブロックが戻るとすぐにその回答が無効になる可能性があります。

于 2013-07-11T16:52:12.287 に答える