我认为最好的方法是使用一些代码:
//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按顺序打印出来?是否有可能跳过正在运行队列中的线程之一?在现实中怎么样。实际上,有没有发生过?如果我想要上面的行为(仍然使用线程)怎么办?我怎么能做到这一点?
最佳答案
不。
不清楚“跳过”是什么意思。如果表示“将按顺序执行块?”答案是“可能,但这是一个实现细节”。
不相关。如果您基于有关实际实现细节的假设来编写并发代码,那么您正在编写不正确的并发代码。
创建一个串行分派(dispatch)队列,并按照需要执行的顺序分派(dispatch)到该队列。请注意,这比@synchronized()
快得多(当然,@synchronized()
不能为您工作,因为它不能保证顺序,而只是保证排他性)。
关于ios - 在Objective-C中使用Grand Central Dispatch可以保证什么行为?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15883373/