2015-02-02 2 views
0

dispatch_sync로 인해 잠긴 스레드를 죽일 수 있습니까? 여기dispatch_sync로 잠긴 스레드를 kill하십시오.

dispatch_sync(q_, ^{ 
    ... 
}); 

이 잠겨 스택 추적한다 :

#0 0x00007fff8d69951a in semaphore_wait_trap() 
#1 0x00007fff9aad7c5b in _os_semaphore_wait() 
#2 0x0000000100aec692 in _dispatch_barrier_sync_f_slow() 

내가 pthread_kill를 사용하여 시도하지만 스레드가 종료되지 않습니다 여기에 코드입니다.

답변

2

모든 POSIX 정보를 살펴 본다면 가능합니다.

실제로는 잊어 버리십시오. 당신은 절대로 작동하지 않을 것입니다. 코드에 교착 상태가있는 경우 교착 상태를 제거하는 유일한 방법은 코드를 수정하는 것입니다.

현재로서는 iOS 장치의 교착 상태가 충돌보다 훨씬 나쁩니다. 앱이 다운되면 많은 사용자가 아무런주의를 기울이지도 않고 다시 시작합니다. 앱이 교착 상태에 빠지면 사용자는 훨씬 복잡한 프로세스를 사용하여 앱을 수동으로 종료해야합니다.

일반적으로 나는 가능한 한 많이 dispatch_sync을 피합니다.

+3

이것은 좋은 조언이지만 좀 더 설명 할 가치가 있습니다. 강제로 스레드를 죽이는 것은 나쁜 아이디어입니다. 왜냐하면 그 스레드에서 실행되는 코드에 의해 할당 된 자원이 유출 될 것이기 때문입니다. 런타임에 임의 스레드가 교착 상태에 있거나 바쁜지 알 수있는 방법이 없습니다. 교착 상태에 있음을 알 수있는 정보가 충분하다면 논리적으로 교착 상태를 막을 수있는 충분한 정보가 있어야합니다. 마지막으로,'dispatch_sync'는 * 유효한 * 사용법을 가지고 있지만, 비동기 코드를 동기식으로 만들거나 인터 로킹 스레드 용으로 사용해서는 안됩니다. (내가 자주 사용하는 방식입니다.) – ipmcc

+0

나는 그 말을하지 않습니다. 스레드가 좋은 해결책입니다, 나는 단지 뭔가를 실험하기 위해 그것을 죽이려 고합니다. 지금까지 교착 상태를 풀기 위해 그것을 죽일 방법을 찾지 못했습니다. – MartinMoizard

0

pthread_kill()은 끝내기 위해 스레드를 "죽이지"않는다. 단지 신호 만 보낸다.

스레드를 끝내려는 (시도하려고하는) 기능은 pthread_cancel()입니다.

그러나 취소는 코드 실행이 취소 지점을 "통과"하는 경우에만 발생합니다. 후자는 잘 정의되어 있습니다. See here for a list.