0

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html#//apple_ref/occ/instm/NSOperationQueue/waitUntilAllOperationsAreFinished上对此方法的描述说:

调用时,此方法会阻塞当前线程并等待接收者的当前和排队操作完成执行。当当前线程被阻塞时,接收器继续启动已经排队的操作并监视那些正在执行的操作。在此期间,当前线程无法向队列添加操作,但其他线程可以。一旦所有挂起的操作都完成了,这个方法就会返回。

我想知道允许这种行为的waitUntilAllOperationsAreFinished背后的代码是什么(阻止当前线程,接收器继续......)?我有兴趣编写产生类似行为的代码,因此我会感谢任何以类似方式表现的等效代码(是的,Apple 对我来说是黑盒)。

更具体地说:NSOperationQueue 如何进行线程阻塞,同时允许接收器处理它的东西(我的猜测:在运行 currentRunLoop 时调度信号量)?

谢谢!

4

2 回答 2

2

正如你所说,实现是未知的。但它很容易实现这种行为:

- (void)waitUntilAllOperationsAreFinished
{
    while(self.operationCount != 0)
        [self _dispatchOperation];
}

_dispatchOperation反过来会阻塞由队列管理的工作线程触发的信号量。当其中一个发出信号时,它将从其队列中分派下一个操作。

于 2012-11-28T19:23:37.363 回答
1

意外地,我发现了这个:How to implement an NSRunLoop inside an NSOperation,处理与我在这里提出的完全相同的问题:“那么我如何在不锁定主线程的情况下完成与 waitUntilFinished:YES 相同的行为?”

与我的另一个 SO 主题配对:“块”主线程(dispatch_get_main_queue())和(或不)定期运行 currentRunLoop - 有什么区别?,它回答了我的问题。

稍后更新:有趣的源代码也与我的问题部分相关:https ://github.com/gnustep/gnustep-base/blob/master/Source/NSOperation.m

于 2012-11-30T03:06:24.490 回答