2011-01-14 21 views
5

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à:

  1. Làm việc với các tài sản mà là nguyên thủy;
  2. 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ột NSArray 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?

+1

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. –

+0

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

+0

@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

Trả lời

6

Bạn không bỏ lỡ bất kỳ điều gì; Tính hữu dụng của atomic phần lớn chỉ giới hạn trong các tình huống mà bạn cần truy cập hoặc đặt một giá trị cụ thể từ nhiều chủ đề trong đó giá trị đó cũng là không thể tách rời.

Ngoài một giá trị, atomic không thể được sử dụng cho mục đích an toàn của chủ đề.

Tôi đã viết khá một chút về nó trong một weblog post a while ago.

Câu hỏi này cũng là một bản sao [rất tốt] trùng lặp của What's the difference between the atomic and nonatomic attributes?

+0

Xin lỗi để khởi động lại một chủ đề 3 năm sau đó nhưng @bbum, bạn có nghĩa là "nơi mà giá trị không phải là không thể tách rời" vì atomicity không đảm bảo cho bạn giá trị nào, chỉ là một giá trị hợp pháp? Tôi đang cố gắng để hiểu công cụ này vì vậy chỉ cần yêu cầu làm rõ của tôi. – MoMo

+0

@MoMo Right.Atomicity chỉ đảm bảo tính toàn vẹn của giá trị, không cho dù bạn sẽ nhận được giá trị mới hay cũ. Và ngay cả cụm từ "vượt quá một giá trị duy nhất" đôi khi không chính xác. Trên PPC, các giá trị 64 bit đôi khi có thể được chia giữa một thanh ghi 32 bit và một mục nhập ngăn xếp 32 bit. – bbum

Các vấn đề liên quan