Тема Objective-C - PullRequest
       1

Тема Objective-C

3 голосов
/ 15 февраля 2012

Как в мире я получил этот результат:

2012-02-15 14:00:46.008 Test[3602:f803] 1: 0
2012-02-15 14:00:46.010 Test[3602:f803] 3: 1
2012-02-15 14:00:46.011 Test[3602:f803] 4: 3
2012-02-15 14:00:46.010 Test[3602:11703] 2: 2

Из этого кода:

TestClass * test = [[TestClass alloc] init];
NSLog(@"1: %i", test.value++);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
     NSLog(@"2: %i", test.value++);
});
@synchronized(test) {
     NSLog(@"3: %i", test.value++);
}
NSLog(@"4: %i", test.value++);

Мои ожидания были бы:

2012-02-15 14:00:46.008 Test[3602:f803] 1: 0
2012-02-15 14:00:46.010 Test[3602:f803] 3: 1
2012-02-15 14:00:46.011 Test[3602:f803] 4: 2
2012-02-15 14:00:46.010 Test[3602:11703] 2: 3

или даже

2012-02-15 14:00:46.008 Test[3602:f803] 1: 0
2012-02-15 14:00:46.010 Test[3602:f803] 3: 1
2012-02-15 14:00:46.010 Test[3602:11703] 2: 2
2012-02-15 14:00:46.011 Test[3602:f803] 4: 3

, поскольку test.value был увеличен в журнале для шага 2, но он не был зарегистрирован?WTH?

1 Ответ

6 голосов
/ 15 февраля 2012

Существует время между моментом вызова NSLog и моментом, когда NSLog записывает строку в журнал.Это может быть прервано в течение этого времени, и поэтому другой поток может потенциально проникнуть в свою запись журнала до того, как этот экземпляр NSLog проснется.

Вот возможная последовательность событий, которая приводит к вашей распечатке:

  1. Поток A вызывает NSLog(@"2: %i", test.value++);, 2 переходит в стек как параметр %i, а 3 записывается в test.value
  2. Поток A получает приоритет всередина подготовки вывода журнала
  3. Основной поток вызывает NSLog(@"4: %i", test.value++);, 3 переходит в стек как параметр %i, а 4 записывается в test.value
  4. Запись основного потока 4: 3 в журнал без предварительной очистки
  5. Поток A просыпается, берет 2 из стека, форматирует вывод и записывает 2: 2 в журнал
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...