从不同的线程访问属性

时间:2012-08-10 17:09:39

标签: objective-c multithreading

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

对于读取操作,需要同步以下哪些属性,哪些属性必须为写入操作进行同步?

@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可能不需要为读取和写入进行同步,因为它们是按值传递的。?

1 个答案:

答案 0 :(得分:4)

嗯,这就是原子特性所擅长的。如果它们都是原子的,那么你可以在不获得部分书面结果的情况下进行读写。

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

虽然你可以使用原子,但在实际情况下它并没有让你受益匪浅。它们使你的程序在执行成本上更加线程抗性(不安全)(两者都很糟糕,顺便说一句)。

顺便说一句,传递值确实不是问题。

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

保持两个相互依赖的ivars完整性的例子:

假设您有两种int类型的原子属性(日,月),并且它们具有访问器。如果读取和写入是从不同的线程发生的,那么你需要的不仅仅是原子来避免读取无效的日期(例如2月31日)。确保您的对象不在部分更新中的唯一方法是使用同步原语或不可变数据 - 这是基础原子属性无法为您节省的。

所以简短的回答是'原子',但并发上下文中的对象很少这么简单,以至于原子的中间界面真的是线程安全