Jak mogę sprawdzić, czy uruchomiłem na danej kolejce GCD bez użycia dispatch_get_current_queue ()?

Ostatnio potrzebowałem funkcji, której mógłbym użyć, aby zagwarantować synchroniczne wykonanie danego bloku w określonej kolejce wysyłki szeregowej. Istnieje możliwość, że ta współdzielona funkcja może zostać wywołana z czegoś już uruchomionego w tej kolejce, więc musiałem sprawdzić tę sprawę, aby zapobiec zakleszczeniu z synchronicznej wysyłki do tej samej kolejki.

W tym celu użyłem kodu podobnego do następującego:

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

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

Ta funkcja polega na użyciudispatch_get_current_queue() aby określić tożsamość kolejki, na której działa ta funkcja, i porównuje ją z kolejką docelową. Jeśli istnieje dopasowanie, wie, że wystarczy uruchomić blok w linii bez wysłania do tej kolejki, ponieważ funkcja jest już na nim uruchomiona.

Słyszałem sprzeczne rzeczy na temat tego, czy było to właściwe, czy niedispatch_get_current_queue() robić porównania w ten sposób i widzę to w nagłówkach:

Zalecany tylko do debugowania i rejestrowania:

Kod nie może zawierać żadnych założeń dotyczących kolejki, chyba że jest to jedna z kolejek globalnych lub kolejka, którą sam kod utworzył. Kod nie może zakładać, że wykonanie synchroniczne w kolejce jest bezpieczne przed zakleszczeniem, jeśli ta kolejka nie jest tą zwróconą przez dispatch_get_current_queue ().

Ponadto w systemie iOS 6.0 (ale jeszcze nie w Mountain Lion) nagłówki GCD oznaczają teraz tę funkcję jako przestarzałą.

Wygląda na to, że nie powinienem używać tej funkcji w ten sposób, ale nie jestem pewien, co powinienem użyć na swoim miejscu. Dla funkcji takiej jak ta, która była skierowana do głównej kolejki, mógłbym użyć[NSThread isMainThread], ale jak mogę sprawdzić, czy działam na jednej z moich niestandardowych kolejek szeregowych, aby zapobiec zakleszczeniu?

questionAnswers(2)

yourAnswerToTheQuestion