gpt4 book ai didi

iphone - 这段代码中dispatch_after方法是并发执行的吗?

转载 作者:可可西里 更新时间:2023-11-01 06:11:40 24 4
gpt4 key购买 nike

int total = 0;            // these are globals..
BOOL dispatchCalled = NO; //

-(void) callDispatch
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
dispatchCalled = YES;
NSLog(@"Total, after 300ms, is %i", total);
});
}

-(void)play // this is my "main" method..
{
NSLog(@"app starts running");

[self callDispatch];

while(!dispatchCalled)
{
total++;
}

[self callDispatch];
}

控制台:

   2012-08-02 20:36:05.357 MyProject[8245:1a07] app starts running
2012-08-02 20:36:05.693 MyProject[8245:3d03] Total, after 300ms, is 11513522
2012-08-02 20:36:05.993 MyProject[8245:3d03] Total, after 300ms, is 11513523

当第一次执行包含在 callDispatch 中的方法时,while 循环有时间执行 11513522 次。此时 while 循环的条件设置为 YES 并且 while 循环不应再执行。但是,它会在确认调度方法条件更新之前再执行一次。这是为什么?

是不是因为 callDispatch 中包含的方法将并发/并行 while 循环一起执行,这就可以解释为什么 while 需要多一个循环了-循环以确认更新的条件?

最佳答案

是的,它正在并发运行。这意味着您的 block 可以在 while 循环期间的任何给定时刻执行,例如在通过条件之后,但在递增全局变量之前,或者在递增全局变量之后。如果多次运行您的代码,您会注意到有时 total 计数匹配,有时不匹配。 (编辑:这意味着您的代码在并发运行时是“不确定的”。)

如果您尝试在串行队列中运行上述代码,while 循环将无限运行,并且永远不会打印总计。在串行队列中,您在 callDispatch 中安排的 block 确实会添加到下一个要调用的队列中,但鉴于无限循环永远不会退出,该队列中的任何其他内容都不会被调用。

Apple 文档中的更多信息:GCD offers three different kinds of queues

关于iphone - 这段代码中dispatch_after方法是并发执行的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11784832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com