Question

J'écriture d'une extension C, fournissant une interface entre Ruby et une bibliothèque d'E / S asynchrone. Lors de l'exécution des tests sur mon code, je reçois souvent des erreurs, y compris (mais sans s'y limiter):

[BUG] cross-thread violation in rb_thread_schedule()

IO signifie Asynchronous mon extension C devra livrer des messages à partir de plusieurs threads Ruby (pas le fil d'interprète principal). Comment puis-je éviter ces violations fil de sécurité, dans le processus?

Était-ce utile?

La solution

Pour Ruby 1.8.x la seule façon d'éviter l'erreur est à l'évidence un - que Invoke l'API Ruby / C du fil d'interprète principal. Je crois que cela s'applique à rubis 1.9.x aussi bien, mais je ne l'ai pas travaillé avec elle et ne sais pas comment le support natif des threads pourrait changer les choses. Au lieu d'avoir plusieurs threads natifs appeler directement l'API, vous devez utiliser le modèle producteur / consommateur pour fournir des demandes de vos threads natifs secondaires à votre code dans le thread principal interprète. Et idéalement faire cela tout en bloquant inutilement d'autres fils verts Ruby. Si vous regardez l'implémentation de Ruby, le programmateur de fil vert rubis est essentialy une boucle de select(). Ceci suggère la structure générale suivante:

  • Créer un tuyau ou un autre mécanisme de la CIB, qui fournit un véritable descripteur de fichier select()-mesure.
  • Spawn threads natifs et de leur fournir de l'extrémité d'écriture du tuyau.
  • Dans le thread principal interprète, entre une boucle d'événements qui appelle rb_thread_wait_fd() à l'extrémité de lecture du tuyau. Cela permettra au planificateur de fil vert rubis pour exécuter d'autres fils verts.
  • Lorsque vos threads natifs secondaires ont des demandes pour le thread principal, ils les file d'attente et également écrire à la conduite, se réveiller le fil vert en cours d'exécution de votre boucle d'événement.

Voir rb_io_sysread() (mise en œuvre de IO#sysread) pour ce qui est probablement le nettoyer à l'aide IO-simple fonction dans la base de code rubis.

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