gpt4 book ai didi

ios - LLVM 编译器——这是一个优化错误吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:54:33 24 4
gpt4 key购买 nike

我有一个与 LLVM 编译器优化级别相关的有趣问题。我正在使用:

  • Xcode 8.2.1
  • LLVM 8.0

最好用示例代码来解释。我将问题归结为一个简单的 objective-c 类。请先看下面的代码:

@interface Foo()  {
BOOL is_loading;
}
@end

@implementation Foo

- (void)test {

printf("started loading \n");

// set loading flag to YES
is_loading = YES;

// schedule a timer to fire in 2 seconds, to simulate the end of loading
[NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(timerFired)
userInfo:nil
repeats:NO];

// wait asynchronously until loading flag is set to NO
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

while (is_loading) {
// loop until timer event modifies is_loading flag
}

printf("finished loading \n");
});
}

- (void)timerFired {

printf("timer fired \n");

// set loading flag to NO
is_loading = NO;

}

@end

如果你实例化类Foo并调用load方法,它会模拟一个加载过程并异步观察is_loading标志来判断是否加载完成了。

然后,控制台输出将是这样的:

started loading
timer fired
finished loading

但是如果你打开编译器优化,你会看到这个输出:

started loading
timer fired

显然,while 循环永远不会结束,并且执行无法到达下一个 printf() 消息。

我是否遗漏了发生这种情况的明显原因,或者它可能是优化器错误?

最佳答案

正如 Apple 在其 synchronization page 上所说的那样优化代码时,编译器可能不会多次加载变量。它不知道它可能是从另一个线程编辑的,所以会发生这种情况。

将变量标记为 volatile 将强制编译器在每次需要时加载该值,而这不会发生。

关于ios - LLVM 编译器——这是一个优化错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43235144/

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