2012-08-28 4 views
7

메인 스레드가 아닌 스레드 내에서 C++의 v8을 사용하려고합니다. v8에 관한 한 다중 스레딩은 없습니다. 모든 v8 객체가 생성되어 해당 스레드 내에서 파괴됩니다. 병렬로 실행되는 것은 없으며 공유되는 것은 없습니다. 메인 스레드에서 프로그램을 실행하면 모든 것이 잘 동작합니다. 다른 스레드에서 v8 자료를 가지고있을 때 v8 :: HandleScope를 만들면 세그먼트 화 오류가 발생합니다.스레드에서 v8을 사용하려면 어떻게해야합니까?

스레딩이 실제로 v8에서 어떻게 처리되는지에 대한 유용한 문서를 찾을 수 없습니다. "격리 및 사물함 사용"지침은 검색 할 때 자주 나타나지만 어떻게 수행되는지 예제를 찾을 수 없습니다. v8 :: Isolate에 관한이 API 문서가 있습니다 만, 그 특정 페이지 (메모리를 공유하지 않거나 병렬로 실행하고 싶지 않은 경우)에 해당 페이지가 필요하지는 않습니다. v8 :: Locker()의 문서에는 클래스가 무엇인지에 대한 정보조차 없습니다. 프로젝트에 포함 된 샘플은 이것도 다루지 않습니다.

그래서 내 질문은 ...

  • 내가 여기 분리 및/또는 금고를 사용해야합니까?
  • 어떻게 사용하는지 최소한의 예를 얻을 수 있습니까? 의사 코드 또는 무언가가 실제로 유용 할 것입니다.

답변

2

HandleScope를 호출 할 때 컨텍스트에서 사용할 메소드에 V8 :: Locker가 필요합니다. https://github.com/jasondelponte/go-v8/blob/master/src/v8context.cc#L41은 v8에서 보관함을 사용하는 방법의 예입니다. 이 예제에서는 다중 스레드와 함께 사용되지만 규칙이 단일 스레드에도 적용된다고 생각합니다.

격리는 v8의 여러 인스턴스를 병렬로 실행하려는 경우에만 필요합니다.

https://groups.google.com/forum/?fromgroups=#!topic/v8-users/FXpeTYuAqKI HandleScope 로컬 변수가 생성되는 즉시 라이브러리가 손상되어 문제가 해결되는 데 도움이되는 오래된 스레드가 있습니다.

관련 문제