2

我正在使用 dispatch_semaphore_wait 来停止我当前的线程,但看起来它停止了我的所有线程。

代码:

SampleReader *reader = [[SampleReader alloc] initWithHostname:hostname andFilePath:filepath];
reader.endHandler = endHandler;

[reader start];

dispatch_semaphore_wait(reader->mSem, DISPATCH_TIME_FOREVER);

我的启动方法类似于:

mFileStream = [[NSOutputStream outputStreamToFileAtPath:[fileurl path] append:FALSE] retain];
[mFileStream open];

mNetworkStream = (NSInputStream *)CFReadStreamCreateWithFTPURL(NULL, (CFURLRef)ftpurl);
mNetworkStream.delegate = self;
[mNetworkStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[mNetworkStream open];

我在其中一个委托方法中获得回调,其中我发出信号量

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{

  switch (eventCode)
  Case NSStreamEventErrorOccurred:
                    dispatch_semaphore_signal(mSem);
        break;
    case NSStreamEventEndEncountered:
        dispatch_semaphore_signal(mSem);
        break;

}

但是,当我在信号量上发送等待时,不会调用委托方法。仅当我注释掉该行时才调用它

 //dispatch_semaphore_signal(mSem);

任何帮助将不胜感激。

4

1 回答 1

4

如果您[reader start]从主线程调用,那么您正在创建死锁。您的流与此处的主线程相关联:

[mNetworkStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

这意味着它的工作主运行循环必须旋转。但是,如果dispatch_semaphore_wait它在主线程上,则您将停止运行循环并阻止流处理其事件。

我不明白除了让永远不会回来之外,注释掉dispatch_semaphore_signal会有什么作用。wait

于 2011-10-31T13:19:55.217 回答