Как я могу "визуализировать" (наблюдать) поток, выходящий из iOS? - PullRequest
1 голос
/ 15 февраля 2020

Когда я изучаю поток и запускаю l oop, я замечаю, что в некоторых статьях говорится: «Как правило, поток просто завершается, как только выполняет свою работу». Поэтому иногда возникает необходимость создать так называемую «бессмертную нить» (я не знаю точного термина на английском языке sh), используя NSRunloop.

Вопрос в том, КАК я могу доказать заявление "просто выходит, как только он сделал свою работу"? Я кодирую вот так

- (void)doSomethingOnThread {
//    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//        NSLog(@"I'm on thread %@", [NSThread currentThread]);
//    });

    NSThread *thread1 = [[NSThread alloc] initWithBlock:^{
        NSLog(@"I'm on thread %@", [NSThread currentThread]);
    }];
    thread1.name = @"thread1";
    [thread1 start];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(threadExitHandler:) name:NSThreadWillExitNotification object:nil];
}

- (void)threadExitHandler:(NSNotification *)noti {
    NSLog(@"Thread will exit: %@", noti);
}

Ну, обработчик уведомлений не вызывается.

Итак, [1]: Как я могу доказать, что поток завершается? [2]: Какие типы потоков ведут себя так (я знаю, что основной поток никогда не выйдет, как насчет других потоков? GCD потоков, например?)

1 Ответ

1 голос
/ 15 февраля 2020

Если вы хотите визуализировать это, я мог бы использовать отладчик. Например, я установил точку останова внутри подкласса NSThread и вижу поток, указанный на левой панели в Xcode:

enter image description here

Но если у меня есть другая точка останова, срабатывающая через одну секунду после завершения метода main, я вижу соответствующее сообщение «Поток завершится», и моя нить больше не присутствует:

enter image description here

Или вы можете добавить оператор NSLog внутри метода dealloc для вашего подкласса NSThread, и это также продемонстрирует его освобождение. Или ищите подкласс в графе объекта отладочной памяти.


Что ж, обработчик уведомлений не вызывается.

Я бы предложил добавить наблюдателя для NSThreadWillExitNotification перед вами. начать свою тему. Прямо сейчас у вас есть условие гонки между началом и выходом из этой нити и добавлением наблюдателя. Кстати, я вижу сообщение «Поток выйдет».

Не имеет отношения, хотя это здорово, узнать о потоках и циклах выполнения, в настоящее время оно мало практично. Возможно, было бы более полезно освоить GCD, который выводит нас из потока потоков и предлагает оптимизацию производительности и более богатый API для написания надежного многопоточного кода.


Относительно того, создает ли GCD постоянные потоки или нет, ответ - да, но мы отвлечены от этой детали. Но одна из оптимизаций производительности GCD заключается в том, что она управляет «пулом» потоков для нас, а не постоянно раскручивает новые потоки и постоянно уничтожает их для каждого отправленного блока кода.

Возможно, вы захотите посмотреть WWD C 2016 Параллельное программирование с GCD в Swift 3 . Он просматривает отношения между очередями, потоками и циклами выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...