Опитвам се да разбера разликата и употребата между тези 2:
static void *myFirstQueue = "firstThread";
dispatch_queue_t firstQueue = dispatch_queue_create("com.year.new.happy", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_set_specific(firstQueue, myFirstQueue, (void*) myFirstQueue, NULL);
Въпрос №1
Каква е разликата между това:
dispatch_sync(firstQueue, ^{
if(dispatch_get_specific(myFirstQueue))
{
//do something here
}
});
и следното:
dispatch_sync(firstQueue, ^{
if(firstQueue == dispatch_get_current_queue())
{
//do something here
}
});
?
Въпрос #2:
Вместо да използвате горния (void*) myFirstQueue
в
dispatch_queue_set_specific(firstQueue, myFirstQueue, (void*) myFirstQueue, NULL);
Можем ли да използваме static int * myFirstQueue = 0;
вместо това?
Разсъжденията ми се основават на факта, че:
dispatch_once_t
също е 0 (има ли някаква връзка тук? Между другото, все още не разбирам защо dispatch_once_t
трябва да се инициализира на 0, въпреки че вече прочетох въпроси тук на SO).
Въпрос №3
Можете ли да ми цитирате пример за GCD Deadlock тук?
Въпрос #4
Това може да е малко прекалено; Все пак ще попитам, ако случайно някой знае това на главата. Ако не, би било добре да оставите тази част без отговор.
Не съм пробвал това, защото наистина не знам как. Но моята концепция е следната:
Има ли все пак, че можем да "поставим манипулатор" в някаква опашка, която ни позволява да задържим манипулатор върху него и по този начин да можем да открием кога настъпва блокиране след отделянето на опашката; и когато има и тъй като имаме манипулатор на опашката, който сме задали преди, можем по някакъв начин да направим нещо, за да отключим безизходицата?
Отново, ако това е твърде много за отговор, или това, или ако разсъжденията ми са напълно необясними / изключени тук (в Въпрос №4), не се колебайте да оставите тази част без отговор.
Честита Нова Година.
@san.t
С static void *myFirstQueue = 0;
Ние правим това:
dispatch_queue_set_specific(firstQueue, &myFirstQueue, &myFirstQueue, NULL);
Напълно разбираемо.
Но ако го направим:
static void *myFirstQueue = 1;
//or any other number other than 0, it would be OK to revert back to the following?
dispatch_queue_set_specific(firstQueue, myFirstQueue, (void*) myFirstQueue, NULL);
Относно dispatch_once_t
:
Бихте ли разяснили повече за това:
Защо dispatch_once_t
първо трябва да бъде 0 и как и защо трябва да действа като булево на по-късен етап? Има ли това общо с памет/безопасност или с факта, че предишният адрес на паметта е бил зает от други обекти, които не са били 0 (nil
)?
Що се отнася до въпрос №3:
Съжалявам, тъй като може да не съм напълно ясен: нямах предвид, че изпитвам задънена улица. Имах предвид дали някой може да ми покаже или не сценарий в код с GCD, който води до блокиране.
Накрая:
Надяваме се, че можете да отговорите на въпрос №4. Ако не, както споменахме по-рано, всичко е наред.
dispatch_get_current_queue
е отхвърлен. Доказано е, че има сериозни основни проблеми. Не е безопасно. Никога не го използвайте. - person matt   schedule 31.12.2013dispatch_get_current_queue()
иdispatch_get_specific()
. - person Brad Larson   schedule 31.12.2013dispatch_get_current_queue
. Детайлите са сложни. В крайна сметка това е нишка на ниво ядро. Но въпросът е, че това конкретно отхвърляне не е просто предложение за сервиране. това е сериозно - person matt   schedule 01.01.2014dispatch_get_current_queue
е лесна за обяснение: Няма един единствен отговор на въпроса на каква опашка работя в момента? в общия случай. Опашките за изпращане са йерархия, която е най-ниска в една от множеството непрозрачни глобални опашки. Може също да има произволни йерархии на опашка, изградени с помощта наdispatch_set_target_queue.
Ако искате да знаете дали сте на главната опашка, използвайте[NSThread isMainThread]
. Ако се опитвате да използвате опашки за прилагане на рекурсивни заключвания, просто спрете. Опашките и заключванията са две различни неща. - person ipmcc   schedule 01.01.2014dispatch_get/set_specific
в някои подробности тук: stackoverflow.com/questions/19833744/ Също така се впуснах в много подробности относно изискванията за нулева степенdispatch_once_t
тук: stackoverflow.com/questions/19832150/ - person ipmcc   schedule 01.01.2014