2017-07-08 10 views
1

pthread_killで特定のスレッドに信号を送信しようとしています。私はpthread_from_mach_thread_np()を使用してハンドルを取得し、pthread_killを使用して信号を送信します。pthread_killをGCD管理のスレッドに変更

これは私の他のテストではうまくいきましたが、GCDで内部的に作成されたスレッドに信号を送るときに、pthread_killからの戻りコード45が返されます。

dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ ... }); 

これが起こっている任意の理由:そのスレッドを生み出し

GCDのAPI?

-

さらに詳しい情報を追加するには、スレッドを強制終了しようとしていません。 pthread_kill()は、シグナルをスレッドに送る標準のPOSIX APIです。シグナルハンドラがインストールされている場合、スレッドのコンテキストは、トランポリンを使用してハンドラに切り替えられます。

シグナルハンドラを使用して達成しようとしていることは、より良い方法で達成できますが、ここでは問題にはなりません。純粋に学術的な理由から、私はここで内部的に何が起こっているのか理解したいと思います。

+0

45 = 'ENOTSUP'、つまり「操作がサポートされていません」 – Rob

+0

@Robはい、ヘッダーに表示されています。しかし、問題はその理由です。それらのスレッドはどう違うのですか? –

+2

[POSIXスレッドとの互換性](https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/ThreadMigration/ThreadMigration.html#//apple_ref/doc/uid/TP40008091-CH105-SW18 )ブロックは "pthread_kill"を呼び出してはいけないと明示的に警告します。 – Rob

答えて

3

pthread_kill() APIは、ワークキュースレッド(GCDの基本となるワーカースレッド)で特に許可されず、このようなスレッドに対してENOTSUPを返します。

これは主に、(これらのスレッドはプロセス内の多くの独立したサブシステムによって使用される共有リソースであるため)コードのコンテキスト内での任意のシグナルハンドラの実行を防止し、システムが将来それを変更する自由を持つように、実行コンテキストを使用することができます。

詳細については、implementationをご覧ください。

0

これは非常に悪い考えです。あなたはGCDのスレッドプールを所有しておらず、スレッドの下からスレッドを強制終了してはいけません。

のいずれかの状況では使用しないでください。

+0

私はスレッドを殺そうとしていません。私はシグナルハンドラをインストールし、そのハンドラを使ってバックトレースアドレスを取得します。 Grep Parkerが信号なしでこれを達成するためにMach APIを使用することはすでに提案されていますが、問題は純粋に学術的な理由からです。あなたの答えは答えではありません。 –