O que significa a propriedade "Não atômica"?


144

O que significa "não atômico" neste código?

@property(nonatomic, retain) UITextField *theUsersName;

Qual é a diferença entre atômica e não atômica?

obrigado


3
Desculpe, esqueci de especificar este está em Objective-C (cacau)


Para quem estiver lendo isso, para 2014, é importante perceber que muitas dessas informações estão extremamente desatualizadas. Em uma palavra, nunca há razão para usar não-atômico e é essencialmente errado usá-lo, por qualquer motivo. é história antiga. Não atômico significa "modo inseguro de thread" e é (em uma palavra) agora totalmente irrelevante. Alguns comentários aqui stackoverflow.com/q/23977765/294884
Fattie

Eu discordo da afirmação "não relevante". Se o valor for alterado raramente e, como o exemplo no documento da Apple, é o sobrenome. Ele muda uma vez e, em seguida, usar uma dica atômica é um desperdício de recursos envolvidos, pois as verificações não são necessárias.
Nick Turner

Respostas:


268

Dê uma olhada no Apple Docs .

Basicamente, se você disser nonatomice gerar os acessadores usando @synthesize, se vários encadeamentos tentarem alterar / ler a propriedade de uma só vez, poderão ocorrer más. Você pode obter valores parcialmente gravados ou objetos liberados / retidos demais, o que pode levar facilmente a falhas. (Isso é potencialmente muito mais rápido que um acessador atômico.)

Se você usar o padrão (que é atomic; não havia palavra-chave para isso, mas existe agora ), os @synthesizemétodos d usarão um bloqueio no nível do objeto para garantir que várias leituras / gravações em uma única propriedade sejam serializadas. Como os documentos da Apple apontam, isso não significa que todo o objeto seja seguro para threads , mas as propriedades / leituras / gravações individuais são.

Obviamente, se você implementar seus próprios acessadores, em vez de usar @synthesize, acho que essas declarações não fazem nada, exceto expressar sua intenção de saber se a propriedade é implementada de maneira segura.


7
Gosto desta resposta - menos confusa, mais simples e mais completa que as encontradas em outros lugares!
PapillonUK

Realmente excelente e menos confuso (+1), mas você pode dizer por que não-atômico potencialmente muito mais rápido que um acessador atômico?
desejo

2
@Wish Os acessadores não atômicos podem ser mais rápidos porque, para impedir que outros threads leiam / gravem ao mesmo tempo, é necessário manter um mutex ou executar outros truques de baixo nível que custam tempo de CPU. Se você estiver usando um bloqueio, também poderá acabar bloqueando outros threads, o que também leva tempo.
precisa saber é o seguinte

1
@ Rob Você pode querer fazer uma nova pergunta sobre isso.
Jesse Rusak

1
@Pratik Desculpe, isso não está correto. A citação que você mostra está dizendo exatamente a mesma coisa que fiz: que criar uma propriedade atomicevita falhas ao acessar propriedades individuais, mas não garante que o objeto como um todo (por exemplo, acessar propriedades separadas, como o nome e o sobrenome) funcione a coisa certa.
precisa saber é o seguinte

46

Depois de ler tantas postagens de artigos e do StackOverflow, e tendo criado aplicativos de demonstração para verificar os atributos de propriedades variáveis, decidi reunir todas as informações de atributos

  1. atomic // default
  2. não atômico
  3. strong = reter // padrão
  4. fraco = unsafe_unretained
  5. reter
  6. atribuir // padrão
  7. unsafe_unretained
  8. cópia de
  9. somente leitura
  10. readwrite // padrão

então, abaixo, está o link detalhado do artigo, onde você pode encontrar todos os atributos mencionados acima, que definitivamente o ajudarão. Muito obrigado a todas as pessoas que dão as melhores respostas aqui !!

Atributos de propriedade variável ou modificadores no iOS

  1. atômico
    • Atômico significa que apenas um encadeamento acessa a variável (tipo estático).
    • Atomic é thread-safe.
    • Mas é lento no desempenho.
    • Atômico é o comportamento padrão.
    • Os acessadores atômicos em um ambiente sem coleta de lixo (ou seja, ao usar reter / liberar / autorelease) usarão um bloqueio para garantir que outro encadeamento não interfira na configuração / obtenção correta do valor.
    • na verdade, não é uma palavra-chave.

Exemplo:

@property (retain) NSString *name;

@synthesize name;
  1. não atômico
    • Não atômico significa que vários threads acessam a variável (tipo dinâmico).
    • Não atômico é um segmento inseguro.
    • Mas é rápido no desempenho.
    • Não atômico NÃO é um comportamento padrão; precisamos adicionar palavras-chave não atômicas no atributo de propriedade.
    • isso pode resultar em um comportamento inesperado, quando dois processos diferentes (threads) acessam a mesma variável ao mesmo tempo.

Exemplo:

@property (nonatomic, retain) NSString *name;

@synthesize name;

12

Além do que já foi dito sobre segurança de encadeamento, propriedades não atômicas são mais rápidas que acessadores atômicos. Geralmente não é algo com que você precise se preocupar, mas lembre-se disso. As propriedades geradas por Dados Principais não são atômicas parcialmente por esse motivo.


9

Em um programa multithread, uma operação atômica não pode ser interrompida parcialmente, enquanto operações não atômicas podem.

Portanto, você deve usar mutexes (ou algo parecido) se tiver uma operação crítica não atômica que não deseja interromper.


8

Se você especificar "atômico", as funções de acesso geradas terão algum código extra para proteger contra atualizações simultâneas.


6

Geralmente atômica significa que as gravações / leituras na propriedade acontecem como uma única operação. Atomic_operation


2

Você pode obter um controle sobre esses materiais lendo o artigo abaixo.

Rosqueamento Explicado com o objetivo não atômico

não atômico - Não é seguro para threads

atomic - Thread Safe - Este é o atributo de propriedade padrão.


1
Tem certeza de que não é o contrário? Propriedades atômicas são seguras, mas propriedades não atômicas não são seguras. A última vez que verifiquei foi assim: P
David Rönnqvist

0

O "atômico" significa que o acesso à propriedade é seguro para threads, enquanto o "não atômico" é o oposto. Quando você declara uma propriedade no Objective-C, a propriedade é atômica por padrão, de modo que os acessadores sintetizados fornecem acesso robusto à propriedade. em um ambiente multithread, ou seja, o valor retornado do getter ou definido através do setter é sempre totalmente recuperado ou definido, independentemente de quais outros threads estejam executando simultaneamente.Mas se você declarar a propriedade como não atômica, como abaixo

@property (nonatomic, retain)  NSString *myString;

então significa que um acessador sintetizado para uma propriedade de objeto simplesmente retorna o valor diretamente. O efeito do atributo não atômico depende do ambiente. Por padrão, os acessadores sintetizados são atômicos. Portanto, o atômico é consideravelmente mais rápido que o atômico.


-2

Um é para multi threads. Um não


IMHO: Para receber votos positivos, você precisa ser mais específico e gastar algum tempo escrevendo sua resposta.
31413 Johan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.