在Objective-C中使用Grand Central Dispatch可以保证什么行为?

时间:2013-04-08 15:40:26

标签: ios objective-c multithreading grand-central-dispatch

我认为提出这个问题的最好方法是使用一些代码:

//Main method
for(int i = 0; i < 10; i++)
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         [self foo:i];
    });

}

- (void) foo: (int) i
{
    @synchronized(self)
    {
        NSLog(@"%d",i);
    }
}

在这种情况下,是否可以保证数字0-9按顺序打印出来?是否有可能跳过等待运行队列的其中一个线程?在现实中如何。实际上,这种情况会发生吗?如果我想要上面的行为(仍然使用线程),该怎么办?我怎么能做到这一点?

2 个答案:

答案 0 :(得分:15)

  

在这种情况下,是否可以保证打印数字0-9   按顺序?

没有

  

是否有机会等待其中一个线程   运行队列,将被跳过?

不清楚“跳过”是什么意思。如果它意味着“将按顺序执行块吗?”答案是“可能,但这是一个实施细节”。

  

在现实中如何。实际上,这种情况会发生吗?

无关。如果您基于对实际实现细节的假设编写并发代码,那么您编写的是不正确的并发代码。

  

如果我想要上面的行为(仍然使用线程),该怎么办?我怎么能   完成这个?

创建一个串行调度队列,并按照需要执行的顺序调度到该队列。请注意,这比@synchronized()要快得多(当然,@synchronized()不会对你有用,因为它不保证顺序,只是排他性)。

答案 1 :(得分:0)

来自dispatch_get_global_queue

的文档
  

提交给这些全局并发队列的块可以相互同时执行。

这意味着那里没有任何保证。您正在将一段代码传递给队列,队列从那里获取它。