gpt4 book ai didi

ios - 在多个线程中使用空引用实例的安全性

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

背景
我有一个Data类,它存储多个输入参数和一个输出值。
只要输入参数之一发生突变,就会重新计算输出值。
该计算花费了很短的时间,因此它是异步执行的。
如果在重新计算期间输入参数之一发生更改,则当前计算被取消,并开始新的计算。
取消逻辑是通过计算操作和键(引用实例)(Data.key)的序列化队列来实现的。每次将新的重新计算添加到队列时,就将Data.key设置为新的引用实例。而且由于队列的原因,一次只能进行一次重新计算。任何执行中的重新计算都会通过同时引用启动时使用它创建的 key 和当前存在的 key 来不断检查它是否是最近启动的计算。如果它们不同,则自重新计算开始以来就已排队等待该重新计算,它将终止。
这将触发队列中的下一次重新计算开始,重复该过程。
我的问题的基础Data.key的重新分配是在主线程上完成的。
当前计算不断检查其 key 是否与当前 key 相同。这意味着另一个线程正在不断访问Data.key
问题)
对我来说,让Data.key易于同时读取/写入容易吗?
甚至有可能同时读取和写入属性?

最佳答案

是Data.Key容易同时读取/写入。
这是我从主线程写入 key 并从MySerialQueue读取 key 的示例。
如果您运行该代码,有时它将崩溃。
崩溃的发生是由于指针的取消指向由主队列写入期间释放的内存所致。
Xcode具有称为ThreadSanitizer的功能,它将有助于捕获此类问题。
Discussion About Race condition

func experiment() {
var key = MyClass()
var key2 = MyClass()

class MyClass {}

func writer() {
for _ in 0..<1000000 {
key = MyClass()
}
}

func reader() {
for _ in 0..<1000000 {
if key === key2 {}
}
}

DispatchQueue.init(label: "MySerialQueue").async {
print("reader begin")
reader()
print("reader end")
}

DispatchQueue.main.async {
print("writer begin")
writer()
print("writer end")
}
}

关于ios - 在多个线程中使用空引用实例的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63353270/

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