Thuộc tính mục tiêu-C mặc định là atomic
, đảm bảo rằng người truy cập là nguyên tử nhưng không đảm bảo an toàn chủ đề chung (theo this question). Câu hỏi của tôi là, không phải là tính chất nguyên tử thừa trong hầu hết các tình huống tương tranh? Ví dụ:Trong những trường hợp nào là tính chất nguyên tử hữu ích?
Kịch bản 1: Các thuộc tính có thể thay đổi
@interface ScaryMutableObject : NSObject {}
@property (atomic, readwrite) NSMutableArray *stuff;
@end
void doStuffWith(ScaryMutableObject *obj) {
[_someLock lock];
[obj.stuff addObject:something]; //the atomic getter is completely redundant and could hurt performance
[_someLock unlock];
}
//or, alternatively
void doStuffWith(ScaryMutableObject *obj) {
NSMutableArray *cachedStuff = obj.stuff; //the atomic getter isn't redundant
[_someLock lock];
[cachedStuff addObject:something]; //but is this any more performant than using a nonatomic accessor within the lock?
[_someLock unlock];
}
Kịch bản 2: tính chất bất biến
Tôi đã suy nghĩ rằng có lẽ tính chất nguyên tử sẽ là hữu ích để tránh ổ khóa khi làm việc với các đối tượng bất biến , nhưng kể từ khi các đối tượng bất biến có thể trỏ đến các đối tượng có thể thay đổi trong Mục tiêu-C, điều này thực sự không giúp được gì nhiều:
@interface SlightlySaferObject : NSObject {}
@property (atomic, readwrite) NSArray *stuff;
@end
void doStuffWith(SlightlySaferObject *obj) {
[[obj.stuff objectAtIndex:0] mutateLikeCrazy];//not at all thread-safe without a lock
}
Các kịch bản duy nhất tôi có thể nghĩ đến nơi đó là an toàn để sử dụng hàm truy nguyên tử mà không có một khóa (và do đó giá trị sử dụng tính chất nguyên tử tại tất cả) là:
- Làm việc với các tài sản mà là nguyên thủy;
- Làm việc với các tính năng mà đảm bảo để không thay đổi và không để trỏ đến đối tượng có thể thay đổi (ví dụ như một
NSString
hoặc mộtNSArray
của đối tượng bất biến).
Tôi có thiếu gì đó không? Có bất kỳ lý do tốt nào khác để sử dụng các thuộc tính nguyên tử không?
Tôi nghĩ câu hỏi SO khác được liên kết bởi bài đăng bao gồm nó. nguyên tử chỉ bao gồm * quyền truy cập * vào thuộc tính - ví dụ: bạn không thể lấy lại một cái rưởi vừa mới một nửa và một nửa mới, nó sẽ hoàn toàn mới hoặc hoàn toàn mới (trong trường hợp của obj-c nó cũng đảm bảo về số lượng giữ lại). Nói chung, có thể yêu cầu toàn bộ khóa/rào cản. Tuy nhiên, truy cập nguyên tử (không phải CAS, mà là khác nhau) có thể được sử dụng trong một số thuật toán "không khóa" và/hoặc các vòng chủ đề chỉ-get-me-out. Vì vậy, có, họ bao gồm một chút hạn chế của mặt đất. –
có thể trùng lặp của [Thuộc tính mục tiêu-C: nguyên tử vs nonatomic] (http://stackoverflow.com/questions/588866/objective-c-properties-atomic-vs-nonatomic) – bbum
@pst Hoàn toàn chính xác và có một số loại vô hướng trên một số ABIs có thể là một phần. Tôi nghĩ rằng đó là PPC mà sẽ đặt một nửa của một loại vô hướng cụ thể trong một đăng ký và một nửa khác trên ngăn xếp như vậy mà bạn thực sự có thể có được một nửa mới nửa hành vi trên một vô hướng giá trị khác! – bbum