Я пытаюсь понять разницу и использование между этими двумя:
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