2012-08-24 6 views
0

저는 목표 C에서 신참입니다. 기본 대기열에 dispatch_async를 사용하여 GCD를 통해 새 스레드를 만드는 객체가 있습니다. 이 스레드를 닫아야하는지 확인하려면 thread에서 timeout = 1sec와 함께 dispatch_semaphore_wait를 사용합니다.dispatch_async 스레드가 끝날 때까지 기다리십시오.

"close"메서드를 호출하면 dispatch_semaphore_signal을 보내고 스레드를 닫습니다. 하지만 때로는 스레드가 "닫기"메소드가 종료 된 후 얼마 동안 계속됩니다. 스레드가 종료 될 때까지 어떻게 "닫기"메서드에서 기다릴 수 있습니까?

Thx.

+0

좋아, 찾았 어 [해결] (http://www.fieryrobot.com/blog/2010/06/27/a-simple-job-queue-with-grand-central-dispatch/) –

+1

왜 원하는지 수동으로 스레드를 관리 하시겠습니까? GCD의 이유는 쓰레드 관리를 막아주는 것입니다. –

답변

3

같은 질문에 정식으로 대답 : 당신은 무엇을하려합니까?

나는 먼저 GCD 요청을 뒷받침하는 스레드와 종료 할 때이를 알거나 신경 쓸 필요가 없어야한다고 요구합니다. 이는 관리하기 위해 전적으로 GCD까지입니다.

둘째, 명시 적 제한 시간 ("FOREVER"제외)을 사용하는 코드에 대해서는 항상 의심해야합니다. "왜 1 초가 걸릴까요?"내가 기다리고있는 어떤 일이이 시간보다 더 많거나 적게 걸리면 어떻게 될까? 폴링은 폴링에 이르는 사고 방식에 종사하고 있으며 폴링은 거의 모든 것을 제외하고는 특정 종류의 장치 드라이버를 작성하는 나쁜 (나쁜, 잘못된) 디자인입니다!

훨씬 더 합리적인 접근법은 작업이 끝났음을 알리는 완료 콜백을 사용하여 프로그래밍에 완전히 비동기적인 접근 방식을 취하고 그 과정에서 GCD의 근본적인 디자인 원칙 중 하나를 따르는 것입니다 .

나에게 들리지만, 기존의 프로그래밍 패러다임이나 사고 방식을 사용하여 GCD에 잘못 적용하고 있다고 생각합니다. 그럼에도 이해할 수있는 실수이지만 실수는 있습니다.

+0

이 스레드를 사용하여 소켓 연결을 제어합니다. 소켓에서 마지막으로 읽은 시간이 N 초 초과하면 서버에 연결 유지 메시지를 보냅니다. 나는. 이 스레드는 객체의 필드를 검사하고, 필요한 경우 메시지를 보냅니다. 나는 스레드가 메인 큐에없는 데이터를 검사한다는 것이 하나의 문제 일 수 있다고 생각한다. –

+0

스레드를 추적하는 것 이외의 다른 방법이 많이 있습니다. 예를 들어 독자 블록에 의해 작성/취소 된 별도의 타이머 소스를 가질 수 있습니다. 타이머 소스가 실행되면 연결 유지자가 보냅니다. 그 전에 읽기가 발생하면 판독기가 타이머 소스를 재설정합니다. – jkh

관련 문제