2017-07-08 4 views
1

Je tente d'envoyer un signal à un thread spécifique avec pthread_kill. J'utilise pthread_from_mach_thread_np() pour obtenir un handle et ensuite utiliser pthread_kill pour envoyer le signal.pthread_kill à un thread géré par GCD

Cela a bien fonctionné dans mes autres tests, mais maintenant je vois que lorsque je tente de signaler un thread créé en interne par GCD, je reçois un code de retour de pthread_kill.

API GCD qui a donné naissance à ce fil:

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

Quel est le motif ce qui se passe?

-

Pour ajouter un peu plus d'informations, je ne suis pas tenté de tuer des fils. pthread_kill() est l'API POSIX standard pour envoyer des signaux aux threads. Si un gestionnaire de signal est installé, le contexte du thread est commuté avec un trampoline au gestionnaire.

Alors que ce que j'essaie d'obtenir en utilisant mon gestionnaire de signal peut être atteint de meilleure façon, cela n'est pas en cause ici. Même si pour des raisons purement académiques, je voudrais comprendre ce qui se passe ici en interne.

+0

45 = 'ENOTSUP', c'est-à-dire" Opération non prise en charge " – Rob

+0

@Rob Oui, j'ai vu cela dans l'en-tête. Mais la question est pourquoi; comment ces fils sont-ils différents? –

+2

Dans [Compatibilité avec les threads POSIX] (https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/ThreadMigration/ThreadMigration.html#//apple_ref/doc/uid/TP40008091-CH105-SW18) ils avertissent explicitement que les blocs "ne doivent pas appeler" "pthread_kill". – Rob

Répondre

3

L'API pthread_kill() est spécifiquement interdite sur les threads de la file d'attente de travail (les threads de travail sous-jacents à GCD) et renvoie ENOTSUP pour ces threads. Ceci vise principalement à empêcher l'exécution de gestionnaires de signaux arbitraires dans le contexte du code qui ne l'attend pas (puisque ces threads sont une ressource partagée utilisée par de nombreux sous-systèmes indépendants dans un processus), ainsi qu'à faire abstraction de contexte d'exécution afin que le système ait la liberté de le changer à l'avenir.

Vous pouvez voir les détails de la façon dont ceci est réalisé dans le implementation.

0

C'est une très mauvaise idée. Vous ne possédez pas de pool de threads GCD, et vous ne devez absolument pas supprimer ses threads en dessous.

La réponse à votre question est NE FAITES-LE DANS AUCUNE CIRCONSTANCE.

+0

Je n'essaie pas de tuer les threads. J'ai un handler de signal installé et obtiens des adresses de traçage en utilisant ce gestionnaire. Il a déjà été suggéré par Grep Parker d'utiliser mach API pour y parvenir sans signaux, mais la question reste purement pour des raisons académiques - en quoi ces threads sont-ils différents? Avec tout le respect que je vous dois, votre réponse n'est pas une réponse. –