Diferença entre Operação Atômica e Segurança de Linhas?

10

Pela discussão que vi, parece que operação atômica e segurança de threads são a mesma coisa, mas muitas pessoas dizem que são diferentes. Alguém pode me dizer a diferença, se houver uma?

user960567
fonte
4
As operações atômicas ajudarão a garantir a segurança do encadeamento, mas como elas podem ser a mesma coisa ? Um "encadeamento" não é o mesmo que uma "operação".
user50849

Respostas:

11

As operações atômicas são uma maneira de obter segurança de encadeamento, usando algum tipo de bloqueio, como Mutexes ou Semáforos, que usam operações atômicas internamente ou implementando a sincronização sem bloqueio, usando atômicos e cercas de memória.

Portanto, operações atômicas em tipos de dados primitivos são uma ferramenta para obter segurança de encadeamento, mas não garantem a segurança de encadeamento automaticamente, porque você normalmente tem várias operações que dependem umas das outras. Você deve garantir que essas operações sejam realizadas sem interrupção, por exemplo, usando Mutexes.

Sim, escrever um desses tipos de dados atômicos em c # é seguro para threads, mas isso não torna a função que você os utiliza no thread seguro. Ele garante apenas que a gravação única seja executada corretamente, mesmo que um segundo thread a acesse "ao mesmo tempo". No entanto, a próxima leitura do encadeamento atual não é garantida para obter o valor gravado anteriormente, pois um encadeamento diferente pode ter gravado nele, apenas que o valor lido seja válido.

Archy
fonte
Int, bool, float são seguros ou atômicos?
user960567
11
@ user960567 - os tipos de dados são exatamente isso: tipos de dados. Cabe ao compilador decidir como acessá-los. Pense em um int64 em uma CPU 8086.
Mouviciel
2
Em C #, especificamente, com a qual a pergunta está marcada, as leituras e gravações devem ser atômicas nos tipos de dados básicos. Veja Ecma 334
user50849
2
E sim, escrever um desses tipos de dados atômicos em c # é seguro para threads, mas isso não torna a função que você os utiliza no thread seguro. Ele garante apenas que a gravação única seja executada corretamente, mesmo que um segundo thread a acesse "ao mesmo tempo". No entanto, a próxima leitura do encadeamento atual não é garantida para obter o valor gravado anteriormente, pois um encadeamento diferente pode ter gravado nele, apenas que o valor lido é válido.
Archy
4
x = 5 é atômico em c #. Mas imediatamente após esta operação, ela pode ser substituída. x = x + 1 é executado por 1. carregando x no registro 2. incrementa x no registro 3. armazena x na memória. Se um segundo encadeamento fizer a mesma coisa ao mesmo tempo, ambos carregarão o mesmo valor, incrementarão e armazenarão, resultando em x sendo incrementado apenas uma vez em vez de duas vezes. O InterlockedIncrement usa uma instrução especial do processador para executar um incremento atômico ou garante isso usando um mecanismo de bloqueio, por exemplo, CAS, para garantir que enquanto o novo valor não for gravado, nenhum outro encadeamento possa ler o valor antigo.
Archy
3

Atomicidade e segurança de linha são duas coisas diferentes. Atomicidade refere-se à qualidade "tudo ou nada" de uma operação; se uma operação não puder ser executada 100% com êxito, o sistema deverá permanecer no estado geral em que estava antes de iniciar qualquer parte da operação. O exemplo clássico é uma transação de banco de dados; Ao salvar uma fatura, incluindo seu cabeçalho e vários itens de linha, todas as partes de cada linha do banco de dados devem ser implementadas com êxito; caso contrário, os dados são perdidos ou corrompidos. Se um item de linha não puder ser inserido, não somente outras linhas restantes serão inseridas, mas nenhuma das linhas já processadas deverá permanecer.

Segurança de thread refere-se a uma combinação de coisas, incluindo atomicidade, que permite que uma operação seja "reentrada"; vários trabalhadores podem estar executando a mesma operação, iniciando no mesmo ou em momentos diferentes, sem afetar nenhum outro. Existem muitos modelos para operação segura de thread; a maioria deles se resume conceitualmente a executar várias tarefas paralelas em completo isolamento (dois trabalhadores podem executar a mesma tarefa em dois objetos diferentes ou coleções de objetos sem nunca saberem que o outro trabalhador sequer existe) ou a configurar um "pipeline" dentro do qual vários trabalhadores executam uma tarefa em uma operação inteira (cada trabalhador progride da primeira tarefa para a seguinte e assim por diante, ou então se concentra em uma tarefa e entrega seu "produto de trabalho" intermediário para o próximo trabalhador).

KeithS
fonte
2

Uma operação atômica é uma operação que não pode ser interrompida.

Um segmento seguro é um segmento que pode ser interrompido com segurança.

A segurança do encadeamento é obtida com operações atômicas, principalmente na lógica que impede que recursos críticos sejam acessados ​​várias vezes.

A operação atômica básica é Test-and-set , usada para implementar semáforos, que por sua vez são usados ​​para implementar a segurança do encadeamento.

mouviciel
fonte
Não é possível interromper uma operação em várias etapas e ainda ser chamada de atômica se for garantida a reversão de suas alterações?
user50849
11
Não. Atômico deve ser entendido em seu significado etimológico: ἄτομος, atomos, indivisível.
Mouviciel
Int, bool, float são seguros ou atômicos?
user960567
Mas não há diferença entre ser indivisível e parecer indivisível para um observador ? Por sua definição, a operação não atômica pode conter mais de uma única etapa. Acredito que a palavra "apareça" na definição de operação atômica da wikipedia é importante. (Eu estou no bate-papo se alguém quiser trazê-lo até lá) :)
user50849
Há uma grande diferença: um segmento seguro pode ser interrompido e não há garantia de quanto tempo. Isso é crítico na computação em tempo real. Uma operação atômica (com bloqueios de interrupção, se houver várias etapas) é garantida para terminar após um período de tempo previsível.
Mouviciel 10/12/12
1

A segurança de threads é mais uma estrutura ou um "conceito", a operação atômica é um subconjunto, um meio (um de muitos) de alcançar o status como sendo classificado como "thread-safe".

A segurança do encadeamento refere-se a um processo que pode ser acessado por encadeamentos separados, nos quais o acesso a um (ea manipulação de dados) não corrompe a integridade da operação do outro.

Grande parte da habilidade do programador é saber como alcançá-lo, dependendo da situação e do objetivo principal, pode ser necessário implementar, por exemplo: bloqueios, semáforos, travas, objetos atômicos, regras de sincronização etc.

ADP
fonte