Portátil thread-segurança em C?
-
10-07-2019 - |
Pergunta
Objectivo
Eu estou escrevendo uma pequena biblioteca para que a portabilidade é a maior preocupação. Ele foi projetado para assumir apenas um C90 principalmente-compliant (ISO / IEC 9899: 1990) ambiente ... nada mais. O conjunto de funções fornecidas pela biblioteca todos operam (leitura / gravação) em uma estrutura de dados interna. Eu considerei algumas outras alternativas de projeto, mas nada mais parece viável para o que a biblioteca é tentando alcançar .
Pergunta ??strong>
Há alguma portáteis algoritmos, técnicas, ou encantamentos que podem ser usadas para garantir segurança de segmentos? Não estou preocupado em fazer as funções de re-entrantes. Além disso, não estou preocupado com a velocidade ou (possivelmente) o desperdício de recursos se o algoritmo / técnica / encantamento é portátil. Idealmente, eu não quero depender de qualquer bibliotecas (tais como GNU PTH) ou operações específicas do sistema (como atômica test-and-set).
Eu tenho considerado modificar de Lamport padaria algoritmo , mas eu não sei como alterá-lo para o trabalho dentro das funções chamadas pelos fios em vez de trabalhar nos próprios tópicos.
Qualquer ajuda é muito apreciada.
Solução
algoritmo de padaria de Lamport provavelmente funcionaria; Infelizmente, ainda existem problemas práticos com ele. Especificamente, muitas CPUs implementar out-of-order operações de memória : mesmo se você 've compilado seu código em uma sequência de instruções perfeitamente correto, o CPU, durante a execução de seu código, pode decidir reordenar as instruções sobre a voar para conseguir um melhor desempenho. A única maneira de contornar este problema é usar barreiras de memória , que são altamente sistema- e CPU espec�ico.
Você realmente só tem duas opções aqui: ou (1) manter a sua biblioteca thread-inseguro e tornar seus usuários cientes de que na documentação, ou (2) usar um mutex específico da plataforma. Opção 2 pode ser facilitada usando outra biblioteca que implementa semáforos para uma grande variedade de plataformas e fornece uma interface unificada, abstrato.
Outras dicas
Sem suporte OS / hardware, pelo menos, uma CAS atômica, não há nada que você pode fazer que é prático. Há são bibliotecas portáteis que abstraem várias plataformas em uma interface comum, no entanto.
Quase todos os sistemas (mesmo Windows) pode executar libpthread estes dias.
Funções ou não pode ser thread-safe ou são inerentemente thread-safe, dependendo de como você deseja olhar para ele. E rosqueamento / bloqueio é inata plataforma específica. Realmente, cabe ao usuários de sua biblioteca para lidar com as questões de encadeamento.