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

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.

Foi útil?

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.

http://www.gnu.org/software/pth/related.html

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.

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