39 votes

Comment puis-je vérifier que je fonctionne sur une file d'attente GCD donnée sans utiliser dispatch_get_current_queue() ?

Récemment, j'ai eu besoin d'une fonction que je pouvais utiliser pour garantir l'exécution synchrone d'un bloc donné sur une file d'attente de distribution série particulière. Il était possible que cette fonction partagée soit appelée à partir d'un bloc déjà en cours d'exécution sur cette file d'attente. J'avais donc besoin de vérifier ce cas afin d'éviter un blocage à partir d'une répartition synchrone sur la même file d'attente.

J'ai utilisé un code comme le suivant pour faire cela :

void runSynchronouslyOnVideoProcessingQueue(void (^block)(void))
{
    dispatch_queue_t videoProcessingQueue = [GPUImageOpenGLESContext sharedOpenGLESQueue];

    if (dispatch_get_current_queue() == videoProcessingQueue)
    {
        block();
    }
    else
    {
        dispatch_sync(videoProcessingQueue, block);
    }
}

Cette fonction repose sur l'utilisation de dispatch_get_current_queue() pour déterminer l'identité de la file d'attente sur laquelle cette fonction est exécutée et la compare à la file d'attente cible. S'il y a une correspondance, il sait qu'il faut simplement exécuter le bloc en ligne sans le dispatch vers cette file d'attente, car la fonction y est déjà exécutée.

J'ai entendu des choses contradictoires sur le fait qu'il était approprié ou non d'utiliser dispatch_get_current_queue() pour faire des comparaisons comme celle-ci, et je vois cette formulation dans les en-têtes :

Recommandé uniquement à des fins de débogage et de journalisation :

Le code ne doit pas faire d'hypothèses sur la file d'attente retournée, à moins qu'il ne s'agisse de l'une des files d'attente globales ou d'une file d'attente que le code a lui-même créée par le code. Le code ne doit pas supposer que l'exécution synchrone sur une queue est à l'abri des blocages si cette file n'est pas celle renvoyée par la commande dispatch_get_current_queue().

En outre, dans iOS 6.0 (mais pas encore dans Mountain Lion), les en-têtes GCD indiquent désormais que cette fonction est obsolète.

Il semble que je ne devrais pas utiliser cette fonction de cette manière, mais je ne suis pas sûr de ce que je devrais utiliser à sa place. Pour une fonction comme celle ci-dessus qui vise la file d'attente principale, je pourrais utiliser [NSThread isMainThread] Mais comment puis-je vérifier si je fonctionne sur l'une de mes files d'attente série personnalisées afin d'éviter un blocage ?

36voto

Rob Napier Points 92148

Attribuez l'identifiant que vous voulez en utilisant dispatch_queue_set_specific() . Vous pouvez ensuite vérifier votre identifiant en utilisant dispatch_get_specific() .

Rappelez-vous que dispatch_get_specific() est bien parce qu'il commencera par la file d'attente actuelle, puis remontera dans les files d'attente cibles si la clé n'est pas définie dans la file actuelle. Cela n'a généralement pas d'importance, mais peut être utile dans certains cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X