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?
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?
Respostas:
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.
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).
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.
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.