gpt4 book ai didi

swift - Swift脚本中的崩溃是否是由竞争条件引起的?

转载 作者:行者123 更新时间:2023-12-03 13:06:24 24 4
gpt4 key购买 nike

运行以下代码通常可以打印:

hello
有时,它会打印:
hello BlockExperiment world
但是有时我会遇到以下崩溃:
hello BlockExperiment/usr/bin/swift[0x51f95a4]
/usr/bin/swift[0x51f719e]
/usr/bin/swift[0x51f987c]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x12980)[0x7fc7c0650980]
/usr/lib/swift/linux/libswiftCore.so(+0x40d2c4)[0x7fc7bc9642c4]
/usr/lib/swift/linux/libswiftCore.so(+0x3fecc6)[0x7fc7bc955cc6]
/usr/lib/swift/linux/libswiftCore.so(+0x3fe20b)[0x7fc7bc95520b]
/usr/lib/swift/linux/libswiftCore.so(+0x3e456d)[0x7fc7bc93b56d]
这似乎并没有破坏我所知道的 weak/ strong/ unowned做法。
问题是否是基本的竞争条件,即在释放语句后正在print语句中访问 self
我不确定,因为在那种情况下,我会希望看到通常的错误消息,说访问是对已释放实例的访问。如果不是这样,您如何分辨并一般调试这种类型的问题?
如果是竞赛条件,为什么有时在“hello”之后会中断打印语句?
代码:
import Foundation

final class BlockRunner {
var block: () -> ()
init(_ b: @escaping () -> ()) { block = b }
func run() { block() }
deinit { print("Deinit: \(self)") }
}

final class BlockExperiment {
func f() {
let queue = DispatchQueue(label: "Queue")
let runner = BlockRunner { print("hello", self, "world") }
queue.asyncAfter(deadline: .now() + 1) { runner.run() }
}
deinit { print("Deinit: \(self)") }
}

do {
let e = BlockExperiment()
e.f()
RunLoop.current.run(until: Date() + 1 + 0.000000000000001)
}

最佳答案

那绝对是比赛条件。如果需要打印出任何内容,则需要在主线程上进行打印。因此,请始终用以下内容包装print语句:

DispatchQueue.main.async {
print("Whatever")
}
最近,当我没有意识到Process()在后台线程中运行我的任务并且看到完全相同类型的日志文本损坏时,我对此感到非常难过。

关于swift - Swift脚本中的崩溃是否是由竞争条件引起的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64903208/

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