如果我想在后台运行任务,"dispatch_get_global_queue"队列如何工作?

Dou*_*ith 2 multithreading objective-c nsoperation grand-central-dispatch ios

在选择要运行的队列dispatch_async时,dispatch_get_global_queue会提到很多.这是一个特殊的后台队列,它将任务委托给某个线程吗?它几乎是一个单身人士吗?

因此,如果我总是将该队列用于我的dispatch_async调用,那么该队列是否会变满并且必须等待其他事情才能启动,或者是否可以将其他任务分配给不同的线程?

我想我有点困惑,因为当我选择队列时NSOperation,我可以选择主线程的队列[NSOperationQueue mainQueue],这似乎是同义词,dispatch_get_main_queue但我在印象背景队列下NSOperation不得不单独制作实例NSOperationQueue但是GCD有一个背景队列单例?(dispatch_get_global_queue)

此外 - 愚蠢的问题,但想确保 - 如果我将一个任务放入队列,队列被分配给一个线程,对吧?如果任务足够大,它就不会在多个线程上拆分,是吗?

ipm*_*mcc 5

当选择运行dispatch_async的队列时,会提到很多dispatch_get_global_queue.这是一个特殊的后台队列,它将任务委托给某个线程吗?

某个线程?No. dispatch_get_global_queue为您检索所请求的相对优先级的全局队列.返回的所有队列dispatch_get_global_queue都是并发的,并且可以由系统自行决定将工作分派给许多不同的线程.其中的机制是一个实现细节,作为API的使用者对您来说是不透明的.

在实践中,并且存在过度简化的风险,每个优先级都有一个全局队列,在撰写本文时,根据我的经验,每个队列在任何给定时间都将调度工作在0到64之间.线程.

它几乎是一个单身人士吗?

严格来说不是,但你可以把它们看作单身,每个优先级有一个单身.

因此,如果我总是将该队列用于我的dispatch_async调用,那么该队列是否会变满并且必须等待其他事情才能启动,或者是否可以将其他任务分配给不同的线程?

它可以满满的.实际上,如果您正在使一个全局并发队列(即同时在飞行中同时具有相同优先级的64个以上后台任务)饱和,那么您的设计可能很糟糕.(有关队列宽度限制的更多详细信息,请参阅此答案)

我想我有点困惑,因为当我选择NSOperation的队列时,我可以用[NSOperationQueue mainQueue]为主线程选择队列,这似乎是dispatch_get_main_queue的同义词

它们不是严格意义上的同义词.尽管NSOperationQueue在引擎盖下使用GCD,但也存在一些重要的差异.例如,在主运行循环的单次传递中,只有一个排队的操作+[NSOperationQueue mainQueue]将被执行,而提交的多个块dispatch_get_main_queue可能在单个运行循环传递上执行.这对你来说可能无关紧要,但严格来说,它们并不是同一回事.

但我印象中NSOperation的背景队列必须是NSOperationQueue的单独实例,但是GCD有一个背景队列的单例?(dispatch_get_global_queue)

简而言之,是的.这听起来像是在混淆GCD和NSOperationQueue.NSOperationQueueGCD不仅仅是一个"琐碎的包装",它也是它自己的东西.它在GCD之上实现的事实对你来说并不重要.NSOperationQueue是一个具有明确可设置宽度的任务队列,您可以创建"随意"的实例.你可以根据自己的喜好制作尽可能多的.在某些时候,所有实例NSOperationQueue都在执行时NSOperations从与您的进程的其余部分(包括GCD)相同的系统资源池中提取资源,所以是的,那里有一些交互,但它们对您来说是不透明的.

此外 - 愚蠢的问题,但想确保 - 如果我将一个任务放入队列,队列被分配给一个线程,对吧?如果任务足够大,它就不会在多个线程上拆分,是吗?

单个任务只能在单个线程上执行.没有一些神奇的方法,系统必须将整体任务"拆分"为子任务.那是你的工作.关于您的具体措辞,队列不是"分配给一个线程",任务是.要执行的队列中的下一个任务可能在完全不同的线程上执行.