Pregunta

Estoy escribiendo una extensión C, proporciona una interfaz entre Ruby y una biblioteca de I / O asíncrono. Al ejecutar las pruebas más de mi código, con frecuencia se producen errores incluyendo (pero no limitados a):

[BUG] cross-thread violation in rb_thread_schedule()

asíncrono IO significa mi extensión C necesitará para entregar mensajes a rubí desde varios subprocesos (no el hilo principal intérprete). ¿Cómo puedo evitar estas violaciónes de hilo de seguridad, en el proceso?

¿Fue útil?

Solución

Para ruby ??1.8.x la única manera de evitar el error es la más obvia - solamente invocar la API Rubí / C del hilo principal intérprete. Creo que esto se aplica al rubí 1.9.x también, pero no he trabajado con él y no sé cómo su soporte nativo para subprocesos podría cambiar las cosas. En lugar de tener múltiples subprocesos nativos directamente invocar la API, es necesario utilizar el modelo de productor / consumidor para entregar las peticiones de sus subprocesos nativos secundarios a su código en el hilo principal intérprete. Y lo ideal es hacerlo mientras no sean innecesariamente el bloqueo de otros hilos verdes Ruby. Si nos fijamos en la implementación de rubí, el programador de subprocesos verde rubí es essentialy un bucle select(). Esto sugiere la siguiente estructura general:

  • Crea una tubería u otro mecanismo de IPC que proporciona una verdadera descriptor de archivo select()-poder.
  • subprocesos nativos
  • desovar y proporcionarles la escritura final de la tubería.
  • En el hilo principal intérprete, introduzca un bucle de eventos que llama rb_thread_wait_fd() en el extremo de lectura de la tubería. Esto permitirá que el programador de subprocesos verde rubí para ejecutar otros hilos verdes.
  • Cuando los subprocesos nativos secundarios tienen solicitudes para el hilo principal, que les Cola y escribir también a la tubería, despertando el hilo verde funcionamiento de su ciclo de eventos.

Ver rb_io_sysread() (aplicación de IO#sysread) por lo que es probable que la limpieza utilizando IO función más simple en la base de código de rubí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top