Question

J'ai une application hautement multithread écrite en Ruby qui partage quelques variables d'instance. Les écritures dans ces variables sont rares (1%) alors que les lectures sont très courantes (99%). Quel est le meilleur moyen (à votre avis ou à la manière idiomatique de Ruby) de vous assurer que ces discussions voient toujours les valeurs les plus récentes en jeu? Voici quelques idées que j'ai eues jusqu'à présent ( bien que j'aimerais avoir votre avis avant de réviser cela):

  • Utilisez un verrou qui sera le plus souvent utilisé avant de lire ou d'écrire l'une de ces variables (extrait de Concurrence Java en pratique ). L'inconvénient, c'est qu'il y a beaucoup de blocs synchronize dans mon code et je ne vois pas comment l'éviter facilement.
  • Utilisez la méthode freeze de Ruby (voir ici ), bien que cela semble tout aussi encombrant et ne me donne aucun des avantages de la première option en termes de synchronisation.

Ces deux options semblent assez similaires, mais nous espérons que tout le monde aura une meilleure idée (ou peut bien argumenter pour l’une de ces idées). Je serais également en mesure de rendre les objets immuables afin qu'ils ne soient pas altérés ou altérés en cours d'opération, mais je ne connais pas assez Ruby pour passer l'appel seul et cette question semble indiquer que les objets sont hautement modifiables.

Était-ce utile?

La solution

Utiliser le verrou est le moyen le plus approprié de le faire. Vous pouvez voir cette présentation de Jim Weirich sur le sujet: Ce que tous les rubyistes devraient savoir sur le filetage .

De plus, geler un objet ne vous aidera pas ici car vous souhaitez modifier ces variables. En les figeant, aucune autre modification ne sera applicable à ces (votre 1% d'écritures ne fonctionneront donc pas).

Autres conseils

Je ne l'ai pas utilisé moi-même, mais vous souhaiterez peut-être consulter Flux de données . Toutes les variables sont écrites une seule fois.

Le verrouillage lecteurs-écrivains est un problème courant avec une solution bien définie:

verrou Readers-writer

et il existe de nombreuses implémentations:

Modèle de verrouillage en écriture

Vous ne souhaitez pas verrouiller chaque lecture / écriture

Vous devez utiliser un mutex pour synchroniser l'accès à l'état partagé. Il n’ya vraiment aucun moyen d’éviter de faire cela.

Sur les machines multicœurs modernes, vous ne pouvez faire aucune supposition sur la manière dont la mémoire sera utilisée ou sur la manière dont les accès à la mémoire vont interagir avec la mise en cache.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top