我认为提出这个问题的最好方法是使用一些代码:
//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按顺序打印出来?是否有可能跳过等待运行队列的其中一个线程?在现实中如何。实际上,这种情况会发生吗?如果我想要上面的行为(仍然使用线程),该怎么办?我怎么能做到这一点?
答案 0 :(得分:15)
在这种情况下,是否可以保证打印数字0-9 按顺序?
没有
是否有机会等待其中一个线程 运行队列,将被跳过?
不清楚“跳过”是什么意思。如果它意味着“将按顺序执行块吗?”答案是“可能,但这是一个实施细节”。
在现实中如何。实际上,这种情况会发生吗?
无关。如果您基于对实际实现细节的假设编写并发代码,那么您编写的是不正确的并发代码。
如果我想要上面的行为(仍然使用线程),该怎么办?我怎么能 完成这个?
创建一个串行调度队列,并按照需要执行的顺序调度到该队列。请注意,这比@synchronized()
要快得多(当然,@synchronized()
不会对你有用,因为它不保证顺序,只是排他性)。
答案 1 :(得分:0)
来自dispatch_get_global_queue
的文档提交给这些全局并发队列的块可以相互同时执行。
这意味着那里没有任何保证。您正在将一段代码传递给队列,队列从那里获取它。