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?