Pergunta

Em um aplicativo C ++ Linux, o que é a maneira mais simples para obter a funcionalidade que o funções bloqueadas sobre Win32 fornece? Especificamente, uma forma leve de atomicamente incremento ou adicionar 32 ou 64 bits inteiros?

Foi útil?

Solução 7

Após uma revisão, este parece promissor. Yay de estouro de pilha.

Outras dicas

open-source da Intel ThreadBuildingBlocks tem um modelo, Atomic, que oferece a mesma funcionalidade que classe Interlocked do .NET .

Atômica do gcc Ao contrário de built-ins, é multiplataforma e não depende de um compilador particular. Como Nemanja Trifunovic corretamente aponta acima, ele não depende da comparar-and-swap instrução CPU fornecido por x86 e Itanium fichas. Eu acho que você não esperaria outra coisa de uma biblioteca Intel:)

Apenas algumas notas para esclarecer a questão que não tem nada a ver com o Linux .

RWM (leia-modificar-escrever) operações e aqueles que não executar em uma necessidade de uma etapa do hardware de suporte para executar atomicamente ; entre eles aumenta e diminui, fetch_and_add, etc.

Para alguns arquitectura (incluindo o I386, AMD_64 e IA64) gcc tem um built-in suporte para acesso à memória atômica, portanto, não é necessária libray externo. Aqui você pode ler algumas informações sobre a API .

A rigor, o Linux pode não oferecer atômica "interligados" funções como aqueles em Win32, simplesmente porque essas funções exigem suporte de hardware, e Linux é executado em algumas plataformas que não oferecem esse apoio. Dito isto, se você pode restringir-se a Intel x86 / x64, dê uma olhada na implementação de contagem de referência no impulso biblioteca ponteiros compartilhado.

funções atômicas do Apache Portable Runtime estão muito perto para as funções Win32 InterlockedXXX.

Você pode inserir um código de montagem em sua fonte, para uso x68 intertravado instruções diretamente.

Você deve usar um Bloqueio xadd operação.

Veja por exemplo este .

A biblioteca glib bastante comum que é usado em GTK e QT programação, bem como ofertas independentes uma variedade de operações atômicas. Consulte http://library.gnome.org/devel/glib /2.16/glib-Atomic-Operations.html para uma lista. Existem funções g_atomic para a maioria das operações que bloqueadas suportes no Win32, e em plataformas onde o hardware suporta directamente estes, eles são inlined como o código de assembly necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top