2012-08-28 16 views
7

Ana iş parçacığı olmayan bir iş parçacığının içinde C++ 'dan v8'i kullanmaya çalışıyorum. V8 ile ilgili olarak çok iş parçacığı yoktur, tüm v8 nesneleri bu iş parçacığı içinde oluşturulur ve yok edilir. Hiçbir şey paralel koşmuyor, hiçbir şey paylaşılmıyor. Programımı ana diziden çalıştırdığımda her şey iyi çalışıyor. Başka bir iş parçacığında v8 nesnesine sahip olduğumda, bir v8 :: HandleScope oluşturduğunda segmentasyon hatası alıyorum.V8'i bir iş parçacığında nasıl kullanırım?

İş parçacığının gerçekte v8 ile nasıl işlendiği hakkında hiçbir yararlı belge bulamıyorum. "İzolatları ve kilitleyicileri kullan" komutu, genellikle arama yaparken ortaya çıkar, ancak bunun nasıl yapıldığına dair bir örnek bulamıyorum. V8 :: Isolate'deki bu API dokümanı var, ancak bu sayfada yer alan hiçbir şey onlara özel durumumda mı (bellek paylaşmadığımı veya paralel olarak yürütülmediğimi) söyler. V8 :: Locker() üzerindeki dokümanlar, sınıfın ne için olduğu hakkında bilgi sahibi bile değil. Projedeki dahil edilen örnekler bunlarla da ilgilenmez.

Yani benim sorular burada ...

  • Burada izolatları ve/veya dolap kullanmak gerekir mi?
  • Onları nasıl kullanacağınıza dair en az bir örnek alabilir miyim? Hatta sözde kod veya bir şey gerçekten yararlı olurdu

cevap

2

HandleScope'u çağırırken bağlamda çalışacak yöntemlerde V8 :: Locker'a ihtiyacınız var. https://github.com/jasondelponte/go-v8/blob/master/src/v8context.cc#L41, dolabı v8 ile nasıl kullandığımın bir örneğidir. Bu örnekte, birden çok iş parçacığı ile kullanılır, ancak kuralın tek bir iş parçacığıyla da geçerli olduğuna inanıyorum.

İzolatlar, yalnızca paralel olarak v8'in birden çok örneğini istediğinizde gerekir.

https://groups.google.com/forum/?fromgroups=#!topic/v8-users/FXpeTYuAqKI Eski bir iş parçacığı, biraz daha önce HandleScope yerel değişkeni oluşturulduktan hemen sonra kütüphanemde çökmemle ilgili sorunumu çözmeme yardımcı oldu.