Quando vários threads acessam simultaneamente uma variável global compartilhada, os threads podem gravar e ler a variável com diferentes cópias armazenadas em cache em diferentes núcleos de processador. É possível que um thread leia um valor obsoleto de seu cache devido à discrepância potencial entre os valores armazenados nos diferentes caches.
No entanto, o padrão C 11 fornece a biblioteca std::atomic para operações atômicas , garantindo que o valor mais recente seja lido do outro cache. Isso é conseguido por meio de uma forte ordenação de memória, que garante que as alterações feitas por um thread sejam visíveis para outros threads em uma ordem consistente.
Por outro lado, a palavra-chave volátil simplesmente indica que uma variável não deve ser otimizada por o compilador, mas não fornece nenhuma garantia de acesso atômico. Ele foi projetado principalmente para cenários como E/S mapeada em memória ou manipulação de sinal.
No contexto de variáveis compartilhadas entre threads, como o seguinte:
std::atomicai;
O comportamento dos tipos voláteis e atômicos será significativamente diferente. volátil não garante acesso atômico e seu uso em combinação com std::atomic é redundante. Se a plataforma de hardware especificar o contrário, volátil pode não ter influência no acesso atômico ou na ordenação de memória entre threads.
Por outro lado, o tipo std::atomic fornece ordenação de memória por meio de várias opções, como std::memory_order_seq_cst , que impõe uma única ordem total para todas as operações atômicas em todas as variáveis. Isso garante que as restrições de visibilidade e ordem sejam mantidas, e os threads não observarão valores obsoletos em uma ordem estritamente definida.
Além disso, usando operações de leitura-modificação-gravação como exchange(), compare_exchange_strong() e fetch_add () garante acesso ao valor mais recente. Ao executar essas operações dentro do mesmo contexto de thread, as threads observarão os valores atualizados na ordem correta, evitando inconsistências.
Trabalhar com operações atômicas requer consideração e compreensão cuidadosas. É aconselhável pesquisar minuciosamente o material de base e o código existente para implementar com eficácia as operações atômicas no código de produção. Em muitos casos, os bloqueios podem fornecer uma alternativa viável quando os desafios das operações atômicas não são necessários.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3