5

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

//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会按顺序打印出来?是否有可能跳过正在运行队列中等待的线程之一?现实中又如何。实际上,这曾经发生过吗?如果我想要上面的行为(仍然使用线程)怎么办?我怎么能做到这一点?

4

2 回答 2

15

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

不。

是否有可能跳过正在运行队列中等待的线程之一?

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

现实中又如何。实际上,这曾经发生过吗?

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

如果我想要上面的行为(仍然使用线程)怎么办?我怎么能做到这一点?

创建一个串行调度队列并按照您需要执行的顺序调度到该队列。请注意,这比@synchronized()(当然,@synchronized()无论如何都不适合您,因为它不能保证顺序,而只是排他性)要快得多。

于 2013-04-08T15:50:28.650 回答
0

来自 dispatch_get_global_queue 的文档

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

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

于 2013-04-08T15:56:38.293 回答