我有一个有趣的问题与LLVM编译器的优化级别有关。我使用的是: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()消息。
我是否错过了这种情况发生的明显原因,或者它可能是优化器错误?
谢谢,这工作..是时候把我的知识关于'volatile' :) – scener
我想补充说,简单地添加'volatile'不会使代码线程安全,所以它仍然可能会失败。 –
这个答案被接受是不幸的。在这种情况下,在volatile中繁忙循环可能会起作用,但它会产生一些令人讨厌的副作用,例如最大化CPU利用率。 –