gpt4 book ai didi

ios - 空 while 循环在 iPhone 发布版本中挂起

转载 作者:行者123 更新时间:2023-11-28 20:17:39 25 4
gpt4 key购买 nike

出于某种原因,在发布版本中有一个空的 while 循环会挂起,而在调试版本中却可以正常工作。此示例在调试中工作但在发布时挂起:

//Wait for stream to open
while (!_isReadyForData);

这是我想出的解决方案,以便让它在发布时工作:

//Wait for stream to open
while (!_isReadyForData)
{
//For some reason in release mode, this is needed
sleep(.5);
}

我很好奇为什么我需要在循环代码块中添加一些东西。

最佳答案

原因当然是由于编译器优化,正如评论中已经指出的那样。

记住 Objective-C 是建立在 C 之上的,我将一个简单的 C 示例与不同级别的优化放在一起,这就是结果。

原始代码

int main(int argc, char const *argv[])  {
char _isReadyForData = 0;
while (!_isReadyForData);
return 0;
}

没有优化的 LLVM IR (-O0)

define i32 @main(i32 %argc, i8** %argv) #0 {
entry:
%retval = alloca i32, align 4
%argc.addr = alloca i32, align 4
%argv.addr = alloca i8**, align 8
%_isReadyForData = alloca i8, align 1
store i32 0, i32* %retval
store i32 %argc, i32* %argc.addr, align 4
store i8** %argv, i8*** %argv.addr, align 8
store i8 0, i8* %_isReadyForData, align 1
br label %while.cond

while.cond: ; preds = %while.body, %entry
%0 = load i8* %_isReadyForData, align 1
%tobool = icmp ne i8 %0, 0
%lnot = xor i1 %tobool, true
br i1 %lnot, label %while.body, label %while.end

while.body: ; preds = %while.cond
br label %while.cond

while.end: ; preds = %while.cond
ret i32 0
}

具有 1 级优化 (-O1) 的 LLVM IR

define i32 @main(i32 %argc, i8** nocapture %argv) #0 {
entry:
br label %while.cond

while.cond: ; preds = %while.cond, %entry
br label %while.cond
}

如您所见,编译器在优化时产生无限循环,因为局部变量 _isReadyForData 在该上下文中无用,因此被删除。

正如@faffaffaff 所建议的,在_isReadyForData 上使用volatile 关键字可能会解决问题。

带 volatile 关键字的 1 级优化 (-O1) 的 LLVM IR

define i32 @main(i32 %argc, i8** nocapture %argv) #0 {
entry:
%_isReadyForData = alloca i8, align 1
store volatile i8 0, i8* %_isReadyForData, align 1
br label %while.cond

while.cond: ; preds = %while.cond, %entry
%_isReadyForData.0.load1 = load volatile i8* %_isReadyForData, align 1
%lnot = icmp eq i8 %_isReadyForData.0.load1, 0
br i1 %lnot, label %while.cond, label %while.end

while.end: ; preds = %while.cond
ret i32 0
}

但我完全同意@rmaddy 的说法,你最好改变你的程序流程并使用驱动逻辑,而不是修补你已经拥有的东西。

关于ios - 空 while 循环在 iPhone 发布版本中挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17304258/

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