在 ObjC++ 中原子 属性 线程安全吗
Is atomic property thread safe in ObjC++
据说使用 "atomic" 的属性在 ObjC 中是线程安全的,但我想知道在带有 pthread 的 ObjC++ 中是否仍然是这样。
首先:不,不是说"atomicity"一般来说和声明的属性都不是线程安全的,Objective-C也不是也不在 C++ 中。原子性意味着没有 getter 或 setter(它在对象级别,因此即使是其他属性的访问者)同时 运行。但它没有说明设置或获取值后立即发生的事情。要获得线程安全,您必须做更多的事情。 (因此声明属性的原子性类似于无意义。)过去 atomic/nonatomic 与内存管理有更多关系。自从我们有了 ARC 之后,这就变得不那么重要了。
在此之后,回答您的问题可能就不那么重要了:它没有记录在案,但过去记录得更多一些。 Apple 表示他们使用了对象级锁。因为即使是非常简单的 NSLock
也在内部使用 pthreads —— 有文档记录 —— 如果你使用 pthread 创建线程,我假设它们是有效的。
一个小样本:
@interface Person
@property NSString *fristName;
@property NSString *lastName;
@end
@implementation Person
@end
控制流程1:
person.firstName = @"Chris";
person.lastName = @"Kienle";
控制流程2:
person.firstName = @"Amin";
person.lastName = @"Negm";
…
NSString *combined = [NSString @"%@ %@", person.firstName, person.lastName];
完美的原子和线程安全访问器的可能结果:
Christian Negm
据说使用 "atomic" 的属性在 ObjC 中是线程安全的,但我想知道在带有 pthread 的 ObjC++ 中是否仍然是这样。
首先:不,不是说"atomicity"一般来说和声明的属性都不是线程安全的,Objective-C也不是也不在 C++ 中。原子性意味着没有 getter 或 setter(它在对象级别,因此即使是其他属性的访问者)同时 运行。但它没有说明设置或获取值后立即发生的事情。要获得线程安全,您必须做更多的事情。 (因此声明属性的原子性类似于无意义。)过去 atomic/nonatomic 与内存管理有更多关系。自从我们有了 ARC 之后,这就变得不那么重要了。
在此之后,回答您的问题可能就不那么重要了:它没有记录在案,但过去记录得更多一些。 Apple 表示他们使用了对象级锁。因为即使是非常简单的 NSLock
也在内部使用 pthreads —— 有文档记录 —— 如果你使用 pthread 创建线程,我假设它们是有效的。
一个小样本:
@interface Person
@property NSString *fristName;
@property NSString *lastName;
@end
@implementation Person
@end
控制流程1:
person.firstName = @"Chris";
person.lastName = @"Kienle";
控制流程2:
person.firstName = @"Amin";
person.lastName = @"Negm";
…
NSString *combined = [NSString @"%@ %@", person.firstName, person.lastName];
完美的原子和线程安全访问器的可能结果:
Christian Negm