gpt4 book ai didi

objective-c - 从不同的线程访问属性

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

我有两个线程访问同一组属性,但是一个线程仅从属性读取,另一个线程仅写入属性。

下列哪些属性需要进行读取操作的同步,哪些属性需要进行写入操作的同步?

@property (nonatomic) int myInt;
@property (nonatomic) NSInteger myInteger;
@property (nonatomic) CGImageRef cgImage;
@property (nonatomic, strong) UIImage *image;
@property (nonatomic, strong) NSMutableArray *array;
@property (nonatomic, strong) UIViewController *controller;

我的第一个直觉是,所有时间都需要对所有读取和写入操作进行同步。但是,由于一个线程总是在写而一个线程总是在读,所以我不确定自己。当然,由于我不确定,始终进行同步是“安全的”,但是我想知道实际上什么是正确的?

由于某种原因,我有一种感觉,也许myInt和myInteger不需要为读取和写入同步,因为它们是通过值传递的。

最佳答案

好,这就是原子性质所擅长的。如果它们都是原子的,那么您可以进行读取和写入而不会得到部分写入的结果。

但是,我从未发现原子objc属性在并发程序中真正有用。我总是导致常规锁定,不变性等等。

尽管您可以使用原子,但在实际情况下并不能带来太多好处。它们使您的程序在执行成本(两者都是不好的,顺便说一句)方面更具线程抵抗力(不安全)。

顺便说一句,通过值(value)传递在这里真的不是问题。

突变可变值或对象(例如,从两个线程从该NSMutableArray进行读取和写入),以及保持相互依赖的ivars的完整性是主要问题。

维护彼此依赖的两个ivar的完整性的示例:

假设您有两个int类型的原子属性(天,月),并且它们具有访问器。如果读取和写入是在单独的线程中进行的,则您需要的不仅仅是原子原子,以避免读取无效的日期(例如2月31日)。真正确保您的对象不在部分更新过程中的唯一方法是使用同步原语或不可变数据-这是基础原子属性无法将您从中拯救出来的。

因此简短的答案是“原子”,但是并发上下文中的对象很少那么简单,以至于原子的中间立场是真正的线程安全的。

关于objective-c - 从不同的线程访问属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11906278/

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