Жергілікті сақтауға тыйым салынуы мүмкін бе?

Мен өзімді бір құдықта таптым.

Google V8 JavaScript қозғалтқышы бар үлкен қосымшасы бар. V8 қозғалтқышына UI желісіне кейбір қоңыраулар жасалады. Пайдаланушыларға жақсы ұсыныс ретінде ұсынылғандай, кейбір ұзын операциялар UI ағыны тіркемесіз бөлек жіпте іске қосылады. Дегенмен, бұл ұзақ әрекеттер V8 JavaScript қозғалтқышына да қоңырау шалады. Мәселен, бірнеше ағындар V8-ке шақырылады.

Мәселе мынада, V8 жергілікті жадты сақтау үшін пайдаланылады. Менің өтінімім кездейсоқ жарылып кетеді. «Бұл әлі күнге дейін бұл қалай жұмыс істейді?» Деген сыныпта анық. қателер.

Менің өтінімімді елеулі түрде қайта құрылымдаусыз, мен өте нашар, түршігерлік сұмдық қорқынышты ұсынамын: V8-ді басқа да жіпте жұмыс істеп жатыр деп ойлай аламын ба?

Басқаша айтқанда, бірінші рет V8-ке қоңырау шалсам, жіпті жазып отырамын. Содан кейін, V8 барлық басқа қоңыраулар үшін , мен бір кездері жіпті жергілікті жадыға/басқа кез келген басқа жұмысқа байланысты жұмыс істейтін етіп жоямын.

Бұл мүмкін бе? Ол жұмыс істей ме? Мен осындай қоқан-лоққы туралы ойлануды ақылсыз ба?

4
Неліктен жадыдағы жергілікті сақтау сіздің қолданбаңызды кездейсоқ бұзады? Бұл мәселені хакеттерсіз түзетуге болатынын білу.
қосылды автор R. Martinho Fernandes, көзі
Мәселені шешпес бұрын оны анық диагноз қою қажет.
қосылды автор David Heffernan, көзі
V8-ке қандай қоңыраулар бар? Егер V8 бірнеше ағындардан дұрыс пайдаланылмаса, бәрі сізді неғұрлым нәзік, күтпеген және қиынға соқпайтын қателіктерге оңай диагноз қойған қателермен алмастырып отыратын боласыз. Сіз өзіңіздің V8 қоңырауларыңызды сериялау жолдарын қарастырыңыз
қосылды автор jalf, көзі

2 жауаптар

Сіз ештеңені жасырмауыңыз керек. Оның орнына V8-ге оны әр түрлі жіптен қолдануға тырысатыныңызды айту керек.

In V8 prior to the version 3.2 the only way to do that is to use v8::Locker before using V8 from the different thread. It guarantees both exclusive access to the V8 and initializes internal structures stored in TLS. For more details see http://code.google.com/p/v8/source/browse/branches/3.1/include/v8.h#3189

Starting from the version 3.2 V8 has the concept of isolate. If you are not creating isolates explicitly, V8 implicitly creates the default isolate to keep API compatible. In this case you can still simply use v8::Locker as in older versions. If you are creating isolates explicitly then in addition to acquiring exclusive access with v8::Locker you also have to enter&exit them explicitly in your threads using v8::Isolate::Enter/v8::Isolate::Exit methods or v8::Isolate::Scope. For more details see http://code.google.com/p/v8/source/browse/trunk/include/v8.h#3510

Көптеген жағдайларда жұмыс істейтін қарапайым жауап мынада: v8 :: Locker пайдаланып, V8-ні түрлі ағыннан қолданыңыз.

19
қосылды
Рахмет, бұл әлдеқайда жақсы шешім. Мен жолға шықтым!
қосылды автор AshleysBrain, көзі

Менде бірдей мәселе болды және шешімді ішінара осы жіп арқылы табуға көмектесті. VE-ның жауабын жасау үшін әдепкі бойынша бірнеше ағындардан v8 пайдалануға болмайды. Егер қаласаңыз, изоляторлар мен құлыптарды пайдалану керек.

Мәселе мынада, сіз жарты жолмен жүре алмайсыз, сіз JS контекстінен толықтай шығып кетіп қалмасаңыз ғана құлыптарды пайдалана алмайсыз. Себебі бұл тривиальды емес жағдайларға байланысты болмайды, сондықтан сіз барлық жолмен жүруіңіз керек

  1. Өзіңіздің v8 :: Isolate құрыңыз. Сіз бұл глобалды жасай аласыз, бірақ (бұл түсінемін) ол әдепкі болып саналмайды (әдепкі бойынша қазірдің өзінде енгізілген күйде).

  2. v8 қоңырау шалатын барлық функцияларыңызда (және ішкі болуы кепілдік берілмейді) сіз оқшаулауыңызды ( v8 :: Isolate :: Scope ) қолданыңыз және

    /li>
  3. 'v8 :: шкаф' нысандарын да қолданыңыз.

Мен қоғамдық әдістемеде қолданатын кішкентай көмекші объектіні жаздым және бұл келесідей көрінеді:

class SessionLock {
private:
    v8::Isolate::Scope scope;
    v8::Locker lock;

public:
    SessionLock() : scope(getSessionIsolate()), lock(getSessionIsolate()) {}
};
1
қосылды