Pergunta

Eu tenho um aplicativo altamente multithreaded escrito em Ruby que compartilha algumas variáveis ??de instância. Escreve a essas variáveis ??são raros (1%), enquanto lê são muito comuns (99%). O que é a melhor maneira (ou na sua opinião ou na forma de Ruby idiomática) para garantir que esses fios sempre ver os valores mais up-to-date envolvidos? Estão aqui algumas idéias tão longe que eu tinha ( embora eu gostaria de sua entrada antes de eu rever este):

  • Tenha um bloqueio que a maioria ser usado antes de ler ou escrever qualquer uma dessas variáveis ??(de Java Concurrency in Practice ). A desvantagem desta situação é que ele coloca um monte de blocos synchronize no meu código e eu não vejo uma maneira fácil de evitá-lo.
  • método freeze de Uso Ruby (consulte aqui ), embora pareça igualmente complicado e doesn' t give me qualquer um dos benefícios de sincronização que a primeira opção dá.

Estas opções ambos parecem bastante semelhantes, mas espero que alguém lá fora, vai ter uma idéia melhor (ou pode argumentar bem para uma dessas idéias). Eu também ficaria bem com fazer os objetos imutáveis ??para que eles não estão corrompidos ou alterados no meio de uma operação, mas eu não sei o Ruby bem o suficiente para fazer a chamada no meu próprio e this questão parece argumentar que os objetos são altamente mutável.

Foi útil?

Solução

Usando o bloqueio é a forma mais apropriada para fazer isso. Você pode ver esta apresentação por Jim Weirich sobre o assunto: o All Rubyist deve saber sobre threading .

Além disso, congelando um objeto não vai ajudá-lo aqui, pois você deseja modificar essas variáveis. Congelá-los no meio de lugar que Sem outras modificações serão aplicáveis ??a estes (e, portanto, o seu 1% de gravações não vai funcionar).

Outras dicas

Eu não usei isso mesmo, mas você pode querer verificar Dataflow . Faz todas as variáveis ??write-once.

O bloqueio de leitores-escritor é um problema comum com uma solução bem definida:

bloqueio de leitores-escritor

e há muitas implementações do mesmo:

padrão de escrita de bloqueio

Você não quer colocar um cadeado na para cada leitura / gravação

Você tem que usar um Mutex para acesso de sincronização para o estado compartilhado. Não há realmente nenhuma maneira de evitar fazer isso.

Em máquinas multi-core modernos que você não pode fazer quaisquer suposições sobre como a memória será acessado ou como acessos de memória irá interagir com o cache.

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