iOS/Objective-C

[Objective-C] atomic vs nonatomic

TDCIAN 2023. 4. 12. 10:50

 

Q. atomic과 nonatomic에 대해 설명해 줘

 

A. 'atomic'과 'nonatomic'은 Objective-C의 프로퍼티 속성 중 하나로, 멀티 스레드 환경에서 객체를 안전하게 접근할 수 있는 방법을 제공합니다.

 

'atomic'은 멀티 스레드 환경에서 객체에 접근할 때, 해당 객체에 대한 접근을 원자적으로 처리하는 것을 의미합니다.

다시 말해, 하나의 스레드에서 객체에 접근하는 도중 다른 스레드에서 접근하려고 하면, 해당 스레드를 기다리도록 합니다.

이렇게 함으로써 하나의 스레드에서 객체에 대한 작업을 완전히 마칠 때까지 다른 스레드가 접근할 수 없도록 보호됩니다.

 

반면에 'nonatomic'은 멀티 스레드 환경에서 원자적으로 처리하지 않고, 다른 스레드에서 객체에 접근할 수 있습니다.

'nonatomic'은 멀티 스레드 환경에서 성능이 더 좋으나, 동시에 여러 스레드에서 객체에 접근하려고 할 때 문제가 발생할 수 있습니다.

 

일반적으로 'nonatomic'을 사용하여 성능 향상을 추구하며, 만약 여러 스레드에서 객체에 접근할 가능성이 있다면 'atomic'을 사용하여 안전한 멀티 스레드 환경을 보장하는 것이 좋습니다. 단, 'atomic'을 사용하면 성능 저하가 발생할 수 있으므로, 성능을 최적화해야 하는 경우에는 'nonatomic'을 고려해야 합니다.

 

 

Q. 위 내용을 Objective-C 코드로 설명해 줘

 

A. 아래는 Objective-C로 작성된 클래스의 'atomic'과 'nonatomic' 프로퍼티의 예시입니다.

@interface MyClass : NSObject

// atomic 프로퍼티
@property (atomic, strong) NSString *atomicString;

// nonatomic 프로퍼티
@property (nonatomic, strong) NSString *nonAtomicString;

@end

위의 예시에서 'atomicString' 프로퍼티는 'atomic'으로 지정되어 있습니다.

따라서 이 프로퍼티에 접근할 때, 해당 객체에 대한 접근을 원자적으로 처리하게 됩니다. 

이를 통해 멀티 스레드 환경에서 안전하게 객체를 접근할 수 있습니다.

 

반면에 'nonAtomicString' 프로퍼티는 'nonatomic'으로 지정되어 있습니다.

따라서 이 프로퍼티에 접근할 때, 원자적으로 처리하지 않고 다른 스레드에서 객체에 접근할 수 있습니다.

이를 통해 멀티 스레드 환경에서 성능이 향상되지만, 여러 스레드에서 동시에 객체에 접근하려는 경우 문제가 발생할 수 있습니다.

 

 

Q. 위의 설명에서 '원자적으로 처리한다'는 것의 개념을 좀 더 이해하기 쉽게 설명해 줘

 

A. '원자적으로 처리한다'는 것은 해당 프로퍼티에 접근할 때, 다른 스레드에서 동시에 같은 프로퍼티에 접근할 수 없도록 보장하는 것을 의미합니다.

 

프로퍼티에 접근하는 코드는 세 가지 과정을 거치게 됩니다.

 

1. 먼저 해당 프로퍼티에 접근하려는 스레드는 해당 프로퍼티의 락(뮤텍스)을 획득합니다.

2. 프로퍼티의 값을 반환하거나 설정하는 작업이 수행됩니다.

3. 작업이 완료되면 해당 프로퍼티의 락을 해제합니다.

 

이러한 과정을 거쳐서 여러 스레드에서 동시에 같은 프로퍼티에 접근해도, 프로퍼티 값이 올바르게 유지될 수 있습니다.

 

따라서, 'atomic'으로 지정된 프로퍼티는 멀티 스레드 환경에서 안전하게 객체를 접근할 수 있지만, 이로 인해 성능이 저하될 수 있습니다.

'nonatomic'으로 지정된 프로퍼티는 멀티 스레드 환경에서 성능이 개선될 수 있지만, 이로 인해 여러 스레드에서 동시에 객체에 접근하려는 경우 문제가 발생할 수 있습니다.

 

 

 

출처: ChatGPT(https://chat.openai.com/chat)