programing

원자 속성과 비원자 속성의 차이점은 무엇입니까?

lastmoon 2023. 4. 22. 10:04
반응형

원자 속성과 비원자 속성의 차이점은 무엇입니까?

요?atomic ★★★★★★★★★★★★★★★★★」nonatomic산산신 고고 ??? ???

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

이들 3개의 운용상의 차이는 무엇입니까?

마지막 2개는 동일합니다.기본 동작은 "atomic"입니다( ). 이 키워드는 실제로는 키워드가 아닌 것에 주의해 주세요. nonatomic --atomicllvm/clang)를 사용합니다.

원자 대 비원자직접 atomic/는 단순히 @LLVM.setter/입니다).인스턴스되어 「인스턴스 변수」가 .인스턴스 변수도 자동으로 합성되어 이 변수가_(직접 접근을 방지하기 위해 이름 앞에 추가됨)

"atomic"을 사용하여 합성된 setter/getter는 다른 스레드 상의 setter 액티비티에 관계없이 항상 getter 또는 setter에 의해 전체 값이 반환되도록 보장합니다.즉, 스레드A가 getter의 중간에 있는 경우 스레드B가 setter를 호출하면 실제 실행 가능한 값(대부분 자동 삭제 객체)이 A의 발신자에게 반환됩니다.

»nonatomicthus따는nonatomic'무엇을 하다'

"원자"가 하는 일은 스레드 안전에 대한 어떠한 보증도 하지 않습니다.스레드 A가 다른 값을 가진 세터를 호출하는 스레드B 및 C와 동시에 getter를 호출하는 경우, 스레드A는 3개의 값(세터가 호출되기 전의 값 또는 B 및 C의 세터에 전달된 값) 중 하나를 반환받을 수 있습니다.마찬가지로 오브젝트는 B 또는 C의 값으로 끝날 수 있습니다.이 값은 알 수 없습니다.

멀티 스레드 프로그래밍의 주요 과제 중 하나인 데이터 무결성을 보장하는 것은 다른 방법으로 이루어집니다.

여기에 추가:

atomicity또한 다중 종속 속성이 재생 중인 경우 스레드 안전을 보장할 수 없습니다.

고려사항:

 @property(atomic, copy) NSString *firstName;
 @property(atomic, copy) NSString *lastName;
 @property(readonly, atomic, copy) NSString *fullName;

는 "A"를 하여 오브젝트의 할 수 .setFirstName:에 전화해요.setLastName:는, 「B」를 할 수 있습니다.fullName스레드 A의 2개의 콜 사이에 새로운 이름이 오래된 성과 결합되어 수신됩니다.

이 문제를 해결하려면 트랜잭션 모델이 필요합니다.즉, 다른 종류의 동기화 및/또는 제외를 통해 접속을 제외할 수 있습니다.fullName종속 속성이 업데이트되는 동안.

이것은 Apple의 설명서에 설명되어 있지만, 아래는 실제로 일어나고 있는 일의 몇 가지 예입니다.

"atomic" 키워드는 없습니다. "nonatomic"을 지정하지 않으면 속성이 atomic이지만 "atomic"을 명시적으로 지정하면 오류가 발생합니다.

"nonatomic"을 지정하지 않으면 속성은 atomic이지만 최근 버전에서는 원하는 경우 "atomic"을 명시적으로 지정할 수 있습니다.

//@property(nonatomic, retain) UITextField *userName;
//Generates roughly

- (UITextField *) userName {
    return userName;
}

- (void) setUserName:(UITextField *)userName_ {
    [userName_ retain];
    [userName release];
    userName = userName_;
}

원자 변형은 조금 더 복잡합니다.

//@property(retain) UITextField *userName;
//Generates roughly

- (UITextField *) userName {
    UITextField *retval = nil;
    @synchronized(self) {
        retval = [[userName retain] autorelease];
    }
    return retval;
}

- (void) setUserName:(UITextField *)userName_ {
    @synchronized(self) {
      [userName_ retain];
      [userName release];
      userName = userName_;
    }
}

기본적으로 아토믹 버전은 스레드의 안전을 확보하기 위해 잠금을 실행해야 합니다.또한 오브젝트의 ref 카운트를 범핑하여 오브젝트가 발신자에게 존재함을 보증합니다.그렇지 않으면 다른 스레드가 값을 설정하고 있을 경우 레이스 상태가 발생할 수 있습니다.참조 카운트가 0으로 떨어집니다.

특성이 스칼라 값인지 객체인지, 유지, 복사, 읽기 전용, 비원자적 상호 작용 등에 따라 이러한 것들이 작동하는 방식에는 실제로 많은 다른 변형이 있습니다.일반적으로 속성 신시사이저는 모든 조합에 대해 "올바른" 방법을 알고 있습니다.

아토믹

  • 디폴트 동작입니다.
  • 다른 프로세스가 변수에 액세스하기 전에 CPU에 의해 현재 프로세스가 완료되었는지 확인합니다.
  • 프로세스가 완전히 완료되기 때문에 고속은 아닙니다.

비원자성

  • 디폴트 동작이 아닙니다.
  • fast (합성 코드의 경우, 즉 @sysize 및 @sysize를 사용하여 작성된 변수의 경우)
  • 스레드 세이프가 아니다
  • 2개의 다른 프로세스가 동시에 같은 변수에 액세스 하면 예기치 않은 동작이 발생할 수 있습니다.

차이를 이해하는 가장 좋은 방법은 다음 예를 사용하는 것입니다.

이름의 이 있고 .[self setName:@"A"]에서 "A"를 합니다.[self setName:@"B"]에서, 「B」 「B」 「B」 「 B 」 。[self name]스레드 C에서 다른 스레드 상의 모든 조작이 시리얼로 실행됩니다.즉, 한 스레드가 세터 또는 게터를 실행하고 있는 경우 다른 스레드는 대기합니다.

에 의해, 속성 「가 「이름」을 하면, 「이름」이 「이름」이 「이름」이 「이름」으로 되어 있으면, 「이름」이 「이름」이 「이름」이 「이름」이 「이름」으로 되어 있는 경우」이 「이름」이 「이름/쓰기」가 호출됩니다.[name release]동시에, 이 조작에 의해서 크래시가 발생할 가능성이 있습니다.세터/게터, 세터/게터.즉, 오브젝트는 읽기/쓰기 안전(ATOMIC)하지만 다른 스레드가 오브젝트에 모든 유형의 메시지를 동시에 보낼 수 있기 때문에 스레드 안전은 아닙니다.개발자는 이러한 물체의 나사산 안전을 보장해야 합니다.

속성 "name"이 nonatomic인 경우 위의 예(A, B, C 및 D)의 모든 스레드가 동시에 실행되어 예측할 수 없는 결과가 발생합니다.원자핵의 경우 A, B 또는 C 중 하나가 먼저 실행되지만 D는 여전히 병렬로 실행할 수 있습니다.

구문과 의미론은 이 질문에 대한 다른 훌륭한 답변에 의해 이미 잘 정의되어 있습니다.실행과 퍼포먼스가 상세하지 않기 때문에 답변을 추가하겠습니다.

이 세 가지 기능상의 차이는 무엇입니까?

나는 항상 원자력을 매우 호기심있는 디폴트로 여겼다.추상화 수준에서 100% 스레드 안전성을 달성하기 위한 수단으로 클래스에 대한 원자 특성을 사용하는 것은 궁지에 몰린 경우입니다.진정으로 올바른 멀티스레드 프로그램에서는 프로그래머의 개입이 거의 필수적입니다.한편, 성능 특성과 실행은 아직 자세히 설명되지 않았습니다.몇 년 의 멀티 스레드 했기 때문에, 는 제 를 "아저씨, 라고 선언은 "아저씨"가 아니라 "아저씨.nonatomic원자력이 어떤 목적으로든 합리적이지 못했기 때문이다.원자적 특성과 비원자적 성질에 대한 세부사항을 논의하는 동안, 나는 몇 가지 프로파일링을 통해 몇 가지 흥미로운 결과를 접했다.

실행

좋습니다. 먼저 명확히 하고 싶은 것은 잠금 구현이 구현 정의되고 추상화되어 있다는 것입니다.는 Louis를 사용합니다.@synchronized(self)그의 예에서--나는 이것이 일반적인 혼란의 원인이라고 보았다.실장에서는, 실제로는,@synchronized(self); 오브젝트 레벨의 스핀 잠금을 사용합니다.루이스의 일러스트는 우리 모두에게 친숙한 구조를 사용한 높은 수준의 일러스트로는 좋지만, 사용하지 않는 것을 아는 것이 중요합니다.@synchronized(self).

또 다른 차이점은 원자 속성이 getter 내에서 객체를 유지/해제한다는 것입니다.

성능

여기 흥미로운 부분이 있습니다.경쟁이 없는(를 들어 싱글 스레드) 케이스에서 원자 속성 액세스를 사용하는 성능은 경우에 따라서는 매우 빠를 수 있습니다.이상적이지 않은 경우 원자성 액세스 사용으로 인해 오버헤드의 20배가 넘는 비용이 발생할 수 있습니다.nonatomic7개의 스레드를 사용한 경우의 속도는 3바이트 구조(2.2GHz Core i7 쿼드코어, x86_64)의 44배였습니다.3바이트 구조는 매우 느린 속성의 예입니다.

흥미로운 점:3바이트 구조의 사용자 정의 접근기는 합성된 원자 접근기보다 52배 더 빨랐습니다. 즉, 합성된 비원자 접근기보다 84% 더 빨랐습니다.

경합이 있는 경우 개체도 50회를 초과할 수 있습니다.

최적화와 구현의 다양성 때문에 이러한 상황에서 실제 영향을 측정하기는 매우 어렵습니다."프로파일을 작성하여 문제가 되지 않는 한 신뢰하십시오."와 같은 말을 자주 들을 수 있습니다.추상화 수준이기 때문에 실제 영향을 측정하기가 매우 어렵습니다.프로파일에서 실제 비용을 수집하는 것은 시간이 많이 걸리고 추상화 때문에 정확하지 않을 수 있습니다.또한 ARC와 MRC는 큰 차이를 만들 수 있습니다.

그럼 한 발 물러서서 재산 접근 구현에 초점을 맞추지 말고 다음과 같은 일반적인 용의자를 포함시켜 보겠습니다.objc_msgSend 「」에의, 합니다.NSString경합이 없는 경우의 getter(초단위 값):

  • MRC | nonatomic | 수동으로 구현된 getter: 2
  • MRC | nonatomic | 합성게터: 7
  • MRC | atomic | 합성게터: 47
  • ARC | nonatomic | composite getter : 38 (주의: ARC는 여기에 ref count cycling을 추가합니다)
  • ARC | atomic | 합성게터: 47

짐작하신 바와 같이 기준 카운트 활동/사이클링은 원자 공학 및 ARC에서 중요한 역할을 합니다.또한 경합이 있는 경우에서 더 큰 차이를 볼 수 있습니다.

퍼포먼스에 세심한 주의를 기울이긴 하지만, 저는 여전히 Semantics First!라고 말하고 있습니다.한편, 많은 프로젝트에서 퍼포먼스는 우선순위가 낮습니다.다만, 사용하고 있는 테크놀로지의 실행의 상세나 코스트에 대해서는, 확실히 알고 있으면 문제가 되지 않습니다.요구, 목적 및 능력에 적합한 기술을 사용해야 합니다.이를 통해 몇 시간 동안 비교할 필요가 없어지고 프로그램을 설계할 때 정보에 입각한 결정을 내리는 데 도움이 되기를 바랍니다.

원자성 = 스레드 안전성

Non-atomic = 스레드 안전성 없음

나사산 안전성:

인스턴스 변수는 런타임 환경에 의한 스레드 실행 스케줄링 또는 인터리빙에 관계없이 여러 스레드에서 접근했을 때 올바르게 동작하고 호출 코드 부분에서 추가 동기화 또는 기타 조정이 없는 경우 스레드 안전합니다.

이 문맥에서는:

스레드가 인스턴스 값을 변경하면 변경된 값은 모든 스레드에서 사용할 수 있으며 한 번에 하나의 스레드만 값을 변경할 수 있습니다.

★★★atomic:

다중 스레드 환경에서 인스턴스 변수에 액세스할 것인지 여부를 지정합니다.

의의의 atomic:

않다nonatomicnonatomic에서는 런타임에서 워치독 작업을 수행할 필요가 없습니다.

★★★nonatomic:

인스턴스 변수가 여러 스레드에 의해 변경되지 않을 경우 이 변수를 사용할 수 있습니다.퍼포먼스가 향상됩니다.

많은 기사, Stack Overflow 게시물을 읽고 다양한 속성 속성을 확인하기 위한 데모 애플리케이션을 만든 후, 모든 속성 정보를 종합하기로 결정했습니다.

  1. atomic // " "
  2. nonatomic
  3. strong = retain // " "
  4. weak = unsafe_unretained
  5. retain
  6. assign // " "
  7. unsafe_unretained
  8. copy
  9. readonly
  10. readwrite // " "

"Variable properties or audifiers in iOS" (변수 속성 또는 iOS 수식자) 기사에는 위의 모든 속성이 나와 있으며, 이는 분명 도움이 될 것입니다.

  1. atomic

    • atomic는 1개의 스레드만 변수에 액세스함을 의미합니다(스태틱타입).
    • atomic스레드 세이프
    • 하지만 성능이 느리다.
    • atomic는 디폴트 입니다.
    • 가비지 수집되지 않은 환경(즉, 유지/릴리스/자동 리스를 사용하는 경우)의 아토믹액세서는 잠금을 사용하여 다른 스레드가 값의 올바른 설정/취득을 방해하지 않도록 합니다.
    • 그것은 실제로 키워드가 아니다.

    예:

        @property (retain) NSString *name;
    
        @synthesize name;
    
  2. nonatomic

    • nonatomic변수(다이나믹 타입)에 액세스 하는 복수의 스레드를 의미합니다.
    • nonatomic스레드 패딩입니다.
    • 단, 퍼포먼스는 빠릅니다.
    • nonatomic는 디폴트 동작이 아닙니다., 그럼 이제 '어울리지 않다'를 돼요.nonatomic키워드를 지정합니다.
    • 2개의 다른 프로세스(스레드)가 같은 변수에 동시에 액세스 하면 예기치 않은 동작이 발생할 수 있습니다.

    예:

        @property (nonatomic, retain) NSString *name;
    
        @synthesize name;
    

여기서 원자 성질과 비원자 성질에 대한 꽤 알기 쉬운 설명을 찾았어요.다음은 같은 내용의 관련 텍스트입니다.

'atomic'은 분해할 수 없다는 뜻입니다.OS/프로그래밍 용어로 원자 함수의 호출은 중단될 수 없습니다.즉, 함수 전체가 실행되어야 하며, OS의 일반적인 컨텍스트 전환에 의해 CPU에서 완전히 전환되지 않아야 합니다.몰랐을 때를 대비해서 CPU는 한 번에 1개밖에 할 수 없기 때문에 OS는 CPU에 대한 접근을 짧은 시간 내에 모든 실행 중인 프로세스에 순환시켜 멀티태스킹처럼 보이게 합니다.CPU 스케줄러는 실행 중 임의의 시점에서 프로세스를 중단할 수 있습니다.중간 함수 호출 중에도 마찬가지입니다.따라서 공유 카운터 변수 업데이트와 같은 두 프로세스가 변수를 동시에 업데이트하려고 할 수 있는 작업의 경우 각 업데이트 작업을 '아토믹하게' 실행해야 합니다. 즉, CPU로 다른 프로세스를 스왑하기 전에 모든 작업을 완료해야 합니다.

따라서 이 경우 atomic은 Atribute Reader 메서드를 중단할 수 없음을 의미합니다.즉, 메서드에 의해 읽히고 있는 변수는 CPU에 다른 스레드/콜/함수가 스왑되기 때문에 값을 중간에 변경할 수 없습니다.

냐하 because는atomic변수를 중단할 수 없습니다. 변수에 포함된 값은 어느 시점에서나 손상되지 않도록 보장됩니다. 단, 이 스레드 잠금으로 인해 변수에 대한 액세스가 느려집니다. non-atomic반면 변수는 이러한 보증을 하지 않지만 보다 빠른 접근이라는 고급스러움을 제공합니다.요약하자면, 다음과 같이 하자.non-atomic여러 스레드가 동시에 변수에 액세스하지 않고 작업 속도를 높일 수 있습니다.

Atomic:

Atomic은 속성에 대한 액세스가 원자적인 방식으로 수행됨을 보증합니다.예: 항상 완전히 초기화된 개체를 반환하며, 다른 스레드가 액세스하려면 먼저 한 스레드의 속성 가져오기/세트를 완료해야 합니다.

두 개의 스레드에서 동시에 다음과 같은 기능이 발생한다고 상상하면 결과가 좋지 않은 이유를 알 수 있습니다.

-(void) setName:(NSString*)string
{
  if (name)
  {
    [name release]; 
    // what happens if the second thread jumps in now !?
    // name may be deleted, but our 'name' variable is still set!
    name = nil;
  }

  ...
}

장점 : 멀티스레딩의 경우 매번 완전히 초기화된 개체를 반환하는 것이 최선의 선택입니다.

단점 : 퍼포먼스가 저하되어 실행이 다소 늦어집니다.

비원자성:

Atomic과 달리 매번 완전히 초기화된 개체를 반환하는 것은 아닙니다.

장점 : 실행 속도가 매우 빠릅니다.

단점 : 멀티스레딩의 경우 가비지 값이 발생할 수 있습니다.

가장 쉬운 답변 먼저:두 번째 예시는 차이가 없습니다.디폴트로는 속성액세서는 atomic입니다.

가비지 수집되지 않은 환경(즉, 유지/릴리스/자동 리스를 사용하는 경우)의 아토믹액세서는 잠금을 사용하여 다른 스레드가 값의 올바른 설정/취득을 방해하지 않도록 합니다.

멀티 스레드 앱을 만들 때 고려해야 할 사항 및 자세한 내용은 Apple Objective-C 2.0 설명서의 "퍼포먼스와 스레드화" 섹션을 참조하십시오.

Atomic은 변수에 액세스하는 스레드는 1개뿐임을 의미합니다(정적 유형).원자력은 안전하지만 느리다.

nonatomic은 여러 스레드가 변수에 액세스하는 것을 의미합니다(동적 유형).비원자는 스레드 안전하지 않지만 빠르다.

Atomic은 스레드 세이프이며 속도가 느립니다.또, 같은 존상에서 액세스를 시도하는 스레드의 수에 관계없이, 잠금치만이 제공되고 있는 것을 보증합니다(보증되지 않습니다).atomic을 사용하는 경우 이 함수에 기록된 코드 조각은 한 번에 하나의 스레드만 실행할 수 있는 critical 섹션의 일부가 됩니다.

스레드 안전만 보장할 뿐, 보증은 하지 않습니다.내 말은, 전문 운전자를 고용하는 건 맞지만, 그래도 사고가 나지 않는다는 보장은 없다는 거야. 하지만, 가능성은 아주 조금밖에 없다.

원자성 - 분해할 수 없으므로 결과가 예측됩니다.nonatomic을 사용하는 경우 - 다른 스레드가 메모리 영역에 액세스하면 수정할 수 있으므로 예기치 않은 결과가 발생합니다.

코드 토크:

속성 스레드의 atomic make getter 및 setter를 안전하게 만듭니다.예를 들어 다음과 같습니다.

self.myProperty = value;

스레드 세이프

[myArray addObject:@"Abc"] 

스레드 세이프가 아닙니다.

atomic(디폴트)

기본적으로는 Atomic입니다.아무것도 입력하지 않으면 속성은 Atomic입니다.atomic 속성에서 읽으려고 하면 유효한 값을 얻을 수 있습니다.이 값은 보증되지 않지만 정크 메모리뿐만 아니라 좋은 데이터를 얻을 수 있습니다.이를 통해 단일 변수를 가리키는 여러 스레드 또는 프로세스가 있는 경우 한 스레드는 읽고 다른 스레드는 쓸 수 있습니다.두 값이 동시에 히트하는 경우 리더 스레드는 변경 전 또는 변경 후 중 하나의 값을 얻을 수 있습니다.원자적으로 얻을 수 없는 것은 그 값들 중 어떤 것을 얻을 수 있는지에 대한 어떤 종류의 보증도 없다는 것입니다.아토믹은 스레드 세이프와 혼동되는 경우가 많습니다만, 그것은 올바르지 않습니다.다른 방법으로 나사산 안전을 보장해야 합니다.그러나 원자력은 읽으려고 하면 어떤 종류의 가치가 돌아온다는 것을 보증합니다.

원자 이외의

반대로, 비원자란, 짐작할 수 있듯이, 단지 "원자적인 것을 하지 말라"는 의미일 뿐입니다.당신이 잃는 것은 당신이 항상 무언가를 되찾는다는 보장입니다.쓰는 도중에 읽으려고 하면 가비지 데이터가 반환될 수 있습니다.하지만 다른 한편으로, 당신은 조금 더 빨리 갑니다.원자 속성은 사용자가 값을 얻을 수 있도록 보장하기 위해 몇 가지 마법을 사용해야 하기 때문에, 그것들은 약간 느립니다.많이 액세스하는 속성인 경우 속도 패널티가 발생하지 않도록 nonatomic으로 드롭할 수 있습니다.

자세한 것은, https://realm.io/news/tmi-objective-c-property-attributes/ 를 참조해 주세요.

"원자"라는 키워드는 없습니다.

@property(atomic, retain) UITextField *userName;

위 내용을 다음과 같이 사용할 수 있습니다.

@property(retain) UITextField *userName;

스택 오버플로우 질문을 참조하십시오.@property(atomic, retain)를 사용하면 문제가 발생합니다.NSString * myString.

기본값은 입니다.atomic이 많이 을 의미합니다.Objective-C가 하는 일은 setter/getter가 실행되는 한 실제 스레드만 변수에 액세스할 수 있도록 잠금이 설정됩니다.

ivar_internal이 있는 속성의 MRC 예:

[_internal lock]; //lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

마지막 두 가지는 동일합니다.

@property(atomic, retain) UITextField *userName;

@property(retain) UITextField *userName; // defaults to atomic

으로 하다nonatomic코드에 아무것도 추가하지 않습니다.따라서 사용자가 직접 보안 메커니즘을 코드화할 경우에만 스레드 세이프가 가능합니다.

@property(nonatomic, retain) UITextField *userName;

키워드는 첫 번째 속성 속성으로 쓸 필요가 없습니다.

잊지 마세요, 이것은 부동산이 전체적으로 안전하다는 것을 의미하지 않습니다.setter/getter 메서드 호출만 가능합니다.하지만 세터를 사용한 후 동시에 2개의 다른 스레드를 사용하여 게터를 사용하면 깨질 수 있습니다!

  • - Atomic은 변수(정적 유형)에 액세스하는 스레드는 1개뿐임을 의미합니다.
  • 아토믹은 스레드루 세이프.
  • 퍼포먼스가 느리다.

선언 방법:

atomic이 디폴트이기 때문에

@property (retain) NSString *name;

AND의 구현 파일

self.name = @"sourov";

세 가지 속성과 관련된 작업이 다음과 같은 작업이 있다고 가정합니다.

 @property (retain) NSString *name;
 @property (retain) NSString *A;
 @property (retain) NSString *B;
 self.name = @"sourov";

모든 속성은 (비동기처럼) 병렬로 작동합니다.

스레드 A에서 "이름"을 호출하면

그리고.

동시에 전화하시면

[self setName:@"Datta"]

스레드 B에서

*name 속성이 nonatomic인 경우

  • A의 값 "Data"를 반환합니다.
  • B의 값 "Data"를 반환합니다.

그렇기 때문에 non atomic은 스레드 안전하지 않지만 병렬 실행으로 인해 성능이 빠릅니다.

현재 *name 속성이 atomic인 경우

  • A의 가치 「Sourov」를 보증합니다.
  • 그런 다음 B의 값 "Data"를 반환합니다.

그래서 아토믹을 스레드 세이프라고 하고 읽기-쓰기 세이프라고 합니다.

이러한 상황 조작은 연속적으로 실행됩니다.퍼포먼스가 느리다

- nonatomic은 변수(동적 유형)에 대한 다중 스레드 액세스를 의미합니다.

- 비원자는 스레드 안전하지 않습니다.

- 단, 퍼포먼스는 빠릅니다.

Nonatomic은 기본 동작이 아닙니다.속성 속성에 nonatomic 키워드를 추가해야 합니다.

In Swift Confirming Swift 부동산이 ObjC의 의미에서 원자적이지 않음을 확인합니다.한 가지 이유는 속성별 원자성이 요구에 충분한지 여부를 생각하기 때문입니다.

참고 자료: https://forums.developer.apple.com/thread/25642

자세한 것은, http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html 를 참조해 주세요.

멀티 스레드 코드로 속성을 사용하고 있는 경우는, 비원자 속성과 원자 속성의 차이를 확인할 수 있습니다.비원자는 원자보다 빠르고 원자는 비원자가 아닌 스레드 세이프이다.

Vijayendra Tripathi는 멀티 스레드 환경의 예를 이미 제시했습니다.

시작하기 전에:새로운 라이터를 작성하려면 메모리 내의 모든 오브젝트를 메모리에서 할당 해제해야 합니다.종이 위에 쓰는 것처럼 그냥 쓸 수는 없어요.먼저 삭제(할당 해제) 후 쓸 수 있습니다.소거가 완료(또는 절반 완료)되고 아직 아무것도 쓰여지지 않은(또는 절반 작성) 시점에서 읽으려고 하면 매우 문제가 될 수 있습니다.원자핵과 비원자핵은 이 문제를 다른 방식으로 처리하는 데 도움이 됩니다.

먼저 이 질문을 읽고 Bum의 답을 읽어보세요.그리고 내 요약도 읽어봐.


atomic

  • 서로 다른 두 사람이 동시에 읽고 쓰기를 원하는 경우, 종이는 그냥 쓰이지 않습니다.--> 레이스 상태에서도 애플리케이션이 크래쉬 하는 일은 없습니다.
  • 한 사람이 쓰기를 시도하고 있으며 8글자 중 4글자만 쓰고 있는 경우, 중간에서 읽을 수 없습니다.읽을 수 있는 것은 8글자가 모두 쓰여져 있는 경우 뿐입니다.-> 아직 쓰고 있는 스레드에서는 읽기(가져오기)가 발생하지 않습니다.즉, 쓰기가8바이트에서 바이트로 되어 있고 4바이트만 쓰여져 있는 경우입니다.읽을 수 없게 되어 있습니다.하지만 충돌하지 않는다고 했으므로 자동 삭제 개체 값에서 읽을 수 있습니다.
  • 을 쓰기 전에 종이에 쓴 것을 지웠는데 누군가가 읽고 싶어 한다면, 어떻게 읽을 수 있을까요?Mac OS 휴지통(휴지통은 아직 100% 지워지지 않았으므로 림보 내에 있음)과 유사한 것을 읽습니다.-> 스레드B가 쓰기 위해 이미 할당 해제된 상태에서 스레드A를 읽으려면 스레드B에 의해 최종적으로 완전히 작성된 값 또는 자동 리스 풀에서 값을 가져옵니다.

보유 카운트는 Objective-C에서 메모리를 관리하는 방법입니다.개체를 생성할 때 유지 개수는 1입니다.개체에 유지 메시지를 보내면 유지 수가 1씩 증가합니다.오브젝트에 릴리스 메시지를 보낼 때 오브젝트의 보유 카운트는 1씩 감소합니다.오브젝트에 자동 리셋메시지를 송신하면, 향후의 어느 단계에서 오브젝트의 보유 카운트가 1씩 감소합니다.오브젝트의 보유 카운트가0 으로 감소하면 할당이 해제됩니다.

  • 아토믹은 스레드의 안전성을 보장하지는 않지만 스레드의 안전성을 달성하는 데 유용합니다.스레드 세이프티는 코드를 쓰는 방법에 따라 달라집니다./ 읽고 쓰는 스레드 큐에 따라 달라집니다.크래시 불가능한 멀티스레딩만 보증합니다.

네?! 멀티스레딩과 스레드 안전성이 다른가요?

네. 멀티스레딩이란 여러 스레드가 동시에 공유 데이터를 읽을 수 있어 크래시가 발생하지 않습니다.다만, 자동 삭제되지 않은 값을 읽어내지 않는 것을 보증하는 것은 아닙니다.스레드 안전성을 통해 읽은 내용이 자동 릴리스되지 않을 수 있습니다.디폴트로는 모든 것을 원자적으로 만들지 않는 이유는 퍼포먼스 비용이 들고 대부분의 경우 스레드 안전이 실제로 필요하지 않기 때문입니다.코드의 일부에 그것이 필요하며, 그 일부에 대해서는 잠금, 뮤텍스 또는 동기화를 사용하여 스레드 세이프 방식으로 코드를 작성해야 합니다.


nonatomic

  • Mac OS 휴지통 같은 것은 없기 때문에 값을 항상 얻는지 안 얻는지(<-- 이것은 크래쉬로 이어질 수 있습니다) 아무도 신경 쓰지 않습니다.또, 기입의 반을 읽으려고 해도, 아무도 신경 쓰지 않습니다(기억의 반을 쓰는 것은 종이에 쓰는 것과 크게 다릅니다만).메모리에서는 이전부터 터무니없는 값을 얻을 수 있지만, 문서에서는 기재된 내용의 절반밖에 표시되지 않습니다.) --> 자동 리셋 메커니즘을 사용하지 않기 때문에 크래시하지 않을 수 있습니다.
  • 전체 쓰기 값을 읽을 수 있는 것은 아닙니다.
  • 원자보다 빠르다

전체적으로 두 가지 측면에서 다릅니다.

  • 자동 리스에 의한 풀의 유무에 의한 크래시 여부.

  • '미완료 쓰기 또는 빈 값' 중간에 바로 읽을 수 있도록 허용하거나 허용하지 않고 값이 완전히 쓰여졌을 때만 읽을 수 있도록 허용합니다.

원자성 원자성(디폴트)

기본적으로는 Atomic입니다.아무것도 입력하지 않으면 속성은 Atomic입니다.atomic 속성에서 읽으려고 하면 유효한 값을 얻을 수 있습니다.이 값은 보증되지 않지만 정크 메모리뿐만 아니라 좋은 데이터를 얻을 수 있습니다.이를 통해 단일 변수를 가리키는 여러 스레드 또는 프로세스가 있는 경우 한 스레드는 읽고 다른 스레드는 쓸 수 있습니다.두 값이 동시에 히트하는 경우 리더 스레드는 변경 전 또는 변경 후 중 하나의 값을 얻을 수 있습니다.원자적으로 얻을 수 없는 것은 그 값들 중 어떤 것을 얻을 수 있는지에 대한 어떤 종류의 보증도 없다는 것입니다.아토믹은 스레드 세이프와 혼동되는 경우가 많습니다만, 그것은 올바르지 않습니다.다른 방법으로 나사산 안전을 보장해야 합니다.그러나 원자력은 읽으려고 하면 어떤 종류의 가치가 돌아온다는 것을 보증합니다.

원자 이외의

반대로, 비원자란, 짐작할 수 있듯이, 단지 "원자적인 것을 하지 말라"는 의미일 뿐입니다.당신이 잃는 것은 당신이 항상 무언가를 되찾는다는 보장입니다.쓰는 도중에 읽으려고 하면 가비지 데이터가 반환될 수 있습니다.하지만 다른 한편으로, 당신은 조금 더 빨리 갑니다.원자 속성은 사용자가 값을 얻을 수 있도록 보장하기 위해 몇 가지 마법을 사용해야 하기 때문에, 그것들은 약간 느립니다.많이 액세스하는 속성인 경우 속도 패널티가 발생하지 않도록 nonatomic으로 드롭할 수 있습니다.접근

customy https://academy.realm.io/posts/tmi-objective-c-property-attributes/

원자성 속성 속성(원자성 및 비원자성)은 대응하는 Swift 속성 선언에 반영되지 않지만 Objective-C 구현의 원자성 보장은 Swift에서 Import된 속성에 액세스할 때 그대로 유지됩니다.

따라서 - Objective-C에서 원자 속성을 정의하면 Swift에서 사용할 때 원자 속성을 유지합니다.

커티시 https://medium.com/@YogevSitton/atomic-vs-non-atomic-properties-crash-course-d11c23f4366c

atomic 속성은 getter 및 setter를 실행하는 스레드 수에 관계없이 완전히 초기화된 값을 유지합니다.

nonatomic 속성은 합성 접근자가 단순히 값을 직접 설정하거나 반환하는 것을 지정하며, 동일한 값이 다른 스레드에서 동시에 액세스될 경우 어떤 일이 일어나는지에 대한 보장은 없습니다.

Atomic은 한 번에 하나의 스레드만 변수에 액세스할 수 있음을 의미합니다(정적 유형).원자력은 안전하지만 느리다.

nonatomic은 여러 스레드가 변수에 동시에 액세스할 수 있음을 의미합니다(동적 유형).비원자는 스레드 안전하지 않지만 빠르다.

사실은 그들은 원자 성질을 구현하기 위해 스핀 잠금을 사용합니다.코드는 다음과 같습니다.

 static inline void reallySetProperty(id self, SEL _cmd, id newValue, 
      ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy) 
    {
        id oldValue;
        id *slot = (id*) ((char*)self + offset);

        if (copy) {
            newValue = [newValue copyWithZone:NULL];
        } else if (mutableCopy) {
            newValue = [newValue mutableCopyWithZone:NULL];
        } else {
            if (*slot == newValue) return;
            newValue = objc_retain(newValue);
        }

        if (!atomic) {
            oldValue = *slot;
            *slot = newValue;
        } else {
            spin_lock_t *slotlock = &PropertyLocks[GOODHASH(slot)];
            _spin_lock(slotlock);
            oldValue = *slot;
            *slot = newValue;        
            _spin_unlock(slotlock);
        }

        objc_release(oldValue);
    }

한 줄로:

Atomic스레드 세이프 Nonatomic스레드 패딩입니다.

atomic을 사용하는 경우 스레드는 안전하고 읽기 전용입니다.nonatomic을 사용하는 경우 여러 스레드가 변수에 액세스하여 스레드가 안전하지 않지만 빠르게 실행되고 읽기 및 쓰기 작업이 수행되므로 동적 유형입니다.

Atomic: NSLOCK을 사용하여 스레드를 잠가 스레드의 안전을 확보합니다.

비원자성:나사산 잠금 메커니즘이 없으므로 나사산 안전이 보장되지 않습니다.

전체 혼동을 단순화하기 위해 뮤텍스 잠금을 이해하겠습니다.

Mutex lock은 이름에 따라 객체의 가변성을 잠급니다.따라서 클래스에서 개체에 액세스할 경우 다른 클래스는 동일한 개체에 액세스할 수 없습니다.

iOS 서서는 in@sychronise뮤텍스 잠금현재는 FIFO 모드로 동작하며 플로우가 같은 인스턴스를 공유하는2개의 클래스의 영향을 받지 않도록 합니다.그러나 작업이 메인 스레드에 있는 경우 UI를 유지하고 성능을 저하시킬 수 있으므로 원자 속성을 사용하여 개체에 액세스하지 마십시오.

Atomic properties :- 스레드액세스가 1개뿐이고 스레드 세이프가 되어 퍼포먼스가 저하되는 것을 의미하는 아토믹 속성으로 할당된 변수는 기본 동작을 가집니다.

Non Atomic Properties :- 변수가 다중 스레드 액세스 권한을 가지며 스레드 안전성이 없고 성능 면에서 빠를 경우 기본 동작을 가지며 두 개의 다른 스레드가 변수에 동시에 액세스하려고 하면 예기치 않은 결과가 발생합니다.

언급URL : https://stackoverflow.com/questions/588866/whats-the-difference-between-the-atomic-and-nonatomic-attributes

반응형