Лучший способ реализовать за счет многопоточности

Я новичок в многопоточности и мне нужен совет.

Я использую ARC в своем коде.

Проблема: я настроил NSTimer в своем приложении, чтобы каждую секунду запускать какой-то метод, который создает и запускает такой поток.

//Create a new thread
mSomeThread = [[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil]; 

//start the thread 
[mSomeThread start]; 

Где mSomeThread - это ivar

Допустим, выполнение mSomeThread занимает более 1 секунды, а mSomeThread выделяется второй раз, то есть в соответствии с «правилами» ARC его освобождают до того, как он будет выделен еще раз.

Означает ли это, что первый поток не завершается и вынужден его завершить?


person deimus    schedule 03.06.2012    source источник


Ответы (2)


NSThread сохраняет себя на время выполнения. Нет никакого риска, что сброс mSomeThread приведет к преждевременному завершению работающего потока.

person Ken Thomases    schedule 03.06.2012

да. Если вам действительно нужно сохранить ссылку на текущий поток выполнения для вашего someMethod, вам нужно дождаться его завершения, прежде чем вы действительно сможете запустить новый поток. Быстрый способ сделать это - добавить

while ([mSomeThread isExecuting]) {
    sleep(1);
}

сразу после [mSomeThread start];.

Кстати, я бы предпочел повторно реализовать NSThread и настроить повторяющийся NSTimer внутри его main реализации. Что-то типа:

- main {
      @autoreleasepool {
          [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(someMethod) userInfo:nil repeats:NO];
          [[NSRunLoop currentRunLoop] run];
        }
}
person alediaferia    schedule 03.06.2012
comment
Использование sleep () в качестве примитива синхронизации неверно; он заблокирует вызывающий поток, использует ненужные ресурсы и приведет к другим проблемам. - person bbum; 03.06.2012