2012-08-28 13 views
7

Próbuję użyć v8 z C++ wewnątrz wątku, który nie jest głównym wątku. W przypadku V8 nie ma wielowątkowości, wszystkie obiekty v8 są tworzone i niszczone w tym wątku. Nic nie działa równolegle, nic nie jest udostępniane. Kiedy uruchamiam program z głównego wątku, wszystko działa poprawnie. Kiedy mam rzeczy v8 w innym wątku, otrzymuję błąd segmentacji, gdy tworzę v8 :: HandleScope.Jak używać v8 w wątku?

Nie mogę znaleźć żadnej użytecznej dokumentacji na temat tego, w jaki sposób wątek jest rzeczywiście adresowany przy użyciu wersji 8. Instrukcja "use isolates and lockers" pojawia się często podczas wyszukiwania, ale nie mogę znaleźć żadnych przykładów, jak to zrobić. Jest ten dokument API na v8 :: Isolate, ale nic na tej stronie nie mówi mi, czy potrzebuję ich w moim konkretnym przypadku (nie dzielę się pamięcią ani nie wykonuję równolegle). Dokumenty na v8 :: Locker() nie mają nawet informacji o tym, do czego służy klasa. Dołączone próbki do projektu również nie zajmują się tym.

więc moje pytania są ...

  • Czy muszę używać izolatów i/lub szafki tutaj?
  • Czy mogę uzyskać minimalny przykład, jak z nich korzystać? Nawet pseudo-kod lub coś byłoby naprawdę przydatne

Odpowiedz

2

Potrzebujesz V8 :: Locker w metodach, które będą działały z kontekstem podczas wywoływania HandleScope. https://github.com/jasondelponte/go-v8/blob/master/src/v8context.cc#L41 to przykład użycia szafki z wersją 8. W tym przykładzie jest używany z wieloma wątkami, ale uważam, że reguła dotyczy również pojedynczych wątków.

Izolacja jest potrzebna tylko w przypadku jednoczesnego równoległego wykonywania wielu wystąpień w wersji 8.

https://groups.google.com/forum/?fromgroups=#!topic/v8-users/FXpeTYuAqKI Jest to stary wątek, który znalazłem jakiś czas temu, który pomógł mi rozwiązać mój problem z awarią biblioteki, gdy tylko utworzono lokalną zmienną HandleScope.

Powiązane problemy