2010-06-12 8 views
0

어제 내가 read somewhere that NSTask isn't thread safe이고 NSThread 내에서 NSTask를 실행 중이며 지금까지 스레딩 문제가 발생하지 않았기 때문에 저에게 많은 불편을 겪습니다.NSTask를 주 스레드 외부에서 안전하게 사용할 수 있습니까?

내 코드는 방지하기 위해, 나는 NSTask 메인 스레드/정지 코드를 시작으로 이동 고려 중이 야 다음, NSTask 만 메인 스레드 내에서 사용하도록되어있는 경우이

A: main thread -> B: worker thread -> C: worker task 

C: The worker task is a commandline program. 
B: The worker thread can start/stop the worker task and send it commands. 
A: The main thread can send commands to the worker thread. 

과 같이 구성되어 있습니다 가능한 스레딩 문제.

NSTask를 주 스레드 외부에서 사용할 수 있습니까?

그리고 그렇지 않다면 NSTask의 스레딩 문제 일 수 있습니까?

답변

4

...

해당 페이지는 말한다하지 무슨 그. NSTask가 스레드를 인식하고 올바른 작업을 수행하려고 시도하는 것과 동일한 시작 스레드에서 프로세스 종료 알림을받을 것이라고합니다.

해당 페이지의 편집자 중 한 명이 문제는 스레드에서 프로세스를 시작한 다음 스레드를 종료시키는 것입니다. 프레임 워크가 더 이상 프로세스 종료 알림을 올바른 스레드에 전달할 수 없어서 충돌이 발생했습니다.

가 밝히는에 대한 클래스 목록에 NSTask을 나열 비슷한 이렇게 말한다 Thread Safety Summary (북마크)은 대부분의 경우에

, 당신만큼 당신이 그들을 사용할 때 모든 스레드에서이 클래스를 사용할 수 있습니다 한 번에 하나의 스레드에서만 실행됩니다. 자세한 내용은 클래스 문서를 확인하십시오.

NSTask 설명서에는 스레드에 대한 추가 내용이 없으므로 NSTask가 "대부분의 경우"중 하나입니다. 사용자가 만든 스레드의 작업을 사용할 수 있습니다. 다른 스레드에서 동일한 작업을 사용하지 말고 (위에서 설명한 것처럼) 스레드가 적어도 작업 프로세스만큼 지속되는지 확인하십시오.

그러나 대부분의 경우 별도의 스레드에서 작업을 실행할 필요가 없습니다. 프로세스의 다른 스레드가 수행하는 것처럼 별도의 프로세스가 다른 프로세서에서 실행되는 경향이 있으며 실행 루프는 많은 작은 이벤트를 다중화하고 UI를 응답 성있게 유지하는 훌륭한 작업을 수행합니다. 작업의 출력을 읽어야 할 경우 NSFileHandle's readInBackgroundAndNotify method을 사용할 수 있습니다. 작업자 스레드를 완전히 잘라낼 수 있습니다.

Eimantas가 ​​제안한 것처럼 대안은 NSOperation을 사용하는 것입니다. 특정 작업을 시작하고 그 작업이 종료 될 때까지 대기하는 작업을했을 것입니다 (아마도 동기식으로 출력을 읽음). 작업이 종료되면 작업이 완료됩니다.

+0

예, 문제를 일으킬 수있는 죽은 스레드에게 알림. 그 코코아 데스 페이지는 나를 의심스럽게 만들었 기 때문에 그것이 분명하지 않은 것이 분명하지 않다는 것을 확신해야했습니다. 백그라운드에서 읽을 필요가 없도록 fileHandleWithNullDevice를 사용하고 있습니다. 대신 두 객체간에 명령을 보낼 수 있도록 양방향 방식으로 분산 객체를 사용하고 있습니다. 작업이 오래 실행됩니다. 가장 훌륭한 답변을 해주셔서 감사합니다. – neoneye

0

예, 가능하지만 NSOperation을 사용하시기 바랍니다. 그것은 KVO에 독립적입니다 (threaded NSTask과는 다릅니다). 또한 KVO 및 스레드 환경 (KVO가 필요한 경우)에 관한 접수 설계 패턴을 조사하고 싶을 수 있습니다. I read somewhere that NSTask isn't thread safe

+0

설명해주십시오. NSOperation에 대해, 네가 알고 있고 내가하고있는 일은 다소 관련이있다. 그러나이 질문은 NSTask를 사용하는 것에 관한 것이다. 스레드간에 NSTask를 공유하지 않는다고 추가해야합니다. – neoneye

+1

NSOperation 및 NSTask는 비교할 수 없습니다. NSOperation은 스레드를 시작합니다. NSTask는 프로세스를 시작합니다.당신은 작업을 시작하는 작업을 할 수는 있지만 네온 스레드가 NSTask를 사용하는 것이 안전한지 여부는 묻습니다. –

관련 문제