2012-08-28 18 views
7

Estoy tratando de usar v8 desde C++ dentro de un hilo que no es el hilo principal. No hay multi-threading en lo que respecta a v8, todos los objetos v8 se crean y destruyen dentro de ese hilo. Nada se ejecuta en paralelo, nada se comparte. Cuando ejecuto mi programa desde el hilo principal, todo funciona bien. Cuando tengo las cosas v8 en otro hilo, recibo un error de segmentación cuando creo un v8 :: HandleScope.¿Cómo uso v8 en un hilo?

No encuentro ninguna documentación útil sobre cómo se está abordando el enhebrado con v8. La instrucción "usar aislamientos y casilleros" aparece con frecuencia cuando se busca, pero no encuentro ningún ejemplo sobre cómo se hace. Hay este documento API en v8 :: Aislar, pero nada en esa página me dice si los necesito en mi caso específico (no estoy compartiendo memoria o ejecutándolos en paralelo). Los documentos en v8 :: Locker() ni siquiera tienen información sobre para qué es la clase. Las muestras incluidas en el proyecto tampoco se ocupan de nada de esto.

Así que mis preguntas son ...

  • ¿Es necesario utilizar aislamientos y/o armarios aquí?
  • ¿Podría obtener un ejemplo mínimo de cómo usarlos? Incluso un pseudocódigo o algo sería realmente útil

Respuesta

2

Necesita V8 :: Locker en los métodos que funcionarán con el contexto al llamar a HandleScope. https://github.com/jasondelponte/go-v8/blob/master/src/v8context.cc#L41 es un ejemplo de cómo he usado el casillero con v8. En este ejemplo, se usa con varios subprocesos, pero creo que la regla se aplica también a los subprocesos individuales.

Los aislamientos solo se necesitan cuando desea varias instancias de v8 en paralelo.

https://groups.google.com/forum/?fromgroups=#!topic/v8-users/FXpeTYuAqKI Es un hilo viejo que encontré hace un tiempo que me ayudó a resolver mi problema con el bloqueo de la biblioteca tan pronto como se creó la variable local de HandleScope.