Ash*_*ain 4 c++ winapi multithreading v8 visual-studio-2010
我发现自己有点夸张.
我有一个大型应用程序,它有谷歌的V8 JavaScript引擎.在UI线程上对V8引擎进行了一些调用.为了对每个人推荐的用户友好,一些长操作在一个单独的线程上运行,而不会挂起UI线程.但是,这些长时间运行的操作也会调用V8 javascript引擎.所以多线程调用V8.
事实是,V8似乎使用线程本地存储.这似乎使我的应用程序随机爆炸.这绝对属于"这可能到现在为止如何运作?" 错误.
在没有重新设计我的应用程序的情况下,我提出了一个丑陋,丑陋可怕的超级黑客攻击:我可以让V8认为它在不同的线程上运行吗?
换句话说,我第一次打电话给V8时,我记下了这个主题.然后,对于V8的所有其他调用,我以某种方式欺骗线程,因此线程本地存储/其他任何线程依赖的工作.
可以吗?它会起作用吗?我甚至认为这样一个骗人的黑客是愚蠢的吗?
Vya*_*rov 19
你不应该欺骗任何东西.相反,你应该告诉V8你正试图从不同的线程中使用它.
在版本3.2之前的V8中,唯一的方法是v8::Locker
在使用来自不同线程的V8之前使用.它保证了对V8的独占访问并初始化存储在TLS中的内部结构.有关详细信息,请参阅http://code.google.com/p/v8/source/browse/branches/3.1/include/v8.h#3189
从版本3.2开始,V8具有隔离的概念.如果您没有显式创建隔离,V8会隐式创建默认隔离以保持API兼容.在这种情况下,您仍然可以v8::Locker
像旧版本一样使用.如果您要显式创建隔离区,那么除了获取与v8::Locker
您的独占访问权限之外,还必须使用v8::Isolate::Enter
/ v8::Isolate::Exit
methods或在您的线程中显式地输入和退出它们v8::Isolate::Scope
.有关详细信息,请参阅http://code.google.com/p/v8/source/browse/trunk/include/v8.h#3510
在大多数情况下可以使用的简单答案是:v8::Locker
在使用不同线程的V8之前使用.