2013-08-09 2 views
0

내 프로그램은 자주 다음 줄에 (나쁜 액세스) 충돌 :NSOutputStream 스레드는 close 및 writeData 메서드에서 안전합니까?

int writeSize = [_outputStream write:pCopyOfDataBuff maxLength:sendLength]; 

pCopyOfDataBuff 할당 그냥 충돌 라인 전에 스택에 데이터가 가득

pCopyOfDataBuff = new unsigned char [sendLength]; 

입니다. Context는이 스트림을 처리하는 특수 스레드입니다.

기호 예외 브레이크 포인트를 사용하여 디버거에서 멈추었을 때 _outputStream이 실제로 이 (가)으로 닫혔습니다.

[_outputStream close]; 

메인 쓰레드 폐쇄 하였다. 이제 이것이 동시에 일어 났을 수 있습니다.

질문 : 다중 스레드에서 이와 같은 NSOutputStream을 처리하는 것이 안전합니까? NSStream에 대한 모든 호출을 동일한 스레드에 동기화해야합니까?

감사합니다. 문서에서 간단한 답을 찾을 수 없습니다.

+0

알다시피, 다른 스레드의 스트림에 액세스하는 것이 안전합니다. 두 가지 디스패치 대기열을 만들고, (CFStreamCreateBoundPair를 통해) 쌍을 이루는 스트림을 만들고, 두 스트림을 열고, 대기열 A에 쓰고 대기열 B에서 읽는 빠른 테스트를 설정해야합니다. close 제 3 큐로부터의 스트림을 랜덤 시간에 출력한다. – CouchDeveloper

+0

감사합니다. 테스트를 위해이 모든 것을 설정하는 데 너무 많은 작업이 필요한 반면, 서로 다른 스트림이 다르게 작동 할 수 있습니다 (제안 된 테스트는 일반적인 것으로 네트워킹이 필요하지 않습니다). –

+0

실행 루프에서 스트림을 예약하는 경우 해당 스레드의 실행 루프에서만 스트림에 액세스해야합니다. 나는 그 스트림을 어떻게 미리 사용하는지 묻지 않았다는 것에 사과드립니다. – CouchDeveloper

답변

3

최근에 같은 문제가 발생했습니다.

-(void)closeStream:(NSStream *)stream { 
    [stream setDelegate:nil]; 
    [stream close]; 
    [stream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 
} 

내 설명이 [self.outputStream write:bytes maxLength:bytesRecieved];와 쓰기의 중간에 출력 스트림이 폐쇄되었다이었다 : 나는 메인 스레드에 대한 몇 가지 대리인이 [myQueue cancelAllOperations]와 함께 작업 큐를 종료하고 다음과 같은 연결을 닫 것을 발견했다.

NSOperationQueue가 완료 될 때까지 기다리면서 해결했습니다 : [myQueue waitUntilAllOperationsAreFinished].

이렇게하면 문제를 해결하는 데 도움이되기를 바랍니다.

+0

왜 이것이 "같은 문제"인지 설명 할 수 있습니까? 내 스트림은 자체 스레드의 runloop에서 실행되는 반면, 사용자 스레드는 주 스레드에서 실행되는 것처럼 보입니다. 또한, 어떤 작업 대기열도 필요하지 않습니다. myQueue의 관련성에 대해 자세히 설명 할 수 있습니까? 어떤 스트림 관련 작업이이 작업 대기열에 추가됩니까? –

관련 문제