我发现自己有点进退两难。
我有一个大型应用程序,其中有 Google 的 V8 javascript 引擎。一些调用是在 UI 线程上对 V8 引擎进行的。为了像大家建议的那样对用户友好,一些长时间操作在单独的线程上运行,而不挂起 UI 线程。然而,这些长时间运行的操作也会调用 V8 JavaScript 引擎。所以多个线程调用V8。
事实是,V8 似乎使用线程本地存储。这似乎使我的应用程序随机爆炸。这绝对属于“到目前为止这怎么可能行得通?”的类别。错误。
在不显着重新架构我的应用程序的情况下,我提出了一个丑陋、丑陋、可怕的超级黑客:我能让 V8 认为它在不同的线程上运行吗?
换句话说,当我第一次调用 V8 时,我会记下该线程。那么,对于对 V8 的所有其他调用,我以某种方式欺骗线程,以便线程本地存储/任何其他线程相关的工作。
能做到吗?它会起作用吗?我是不是太蠢了,竟然考虑这么卑鄙的黑客?
你不应该欺骗任何东西。相反,您应该告诉 V8 您正在尝试从不同的线程使用它。
在 3.2 版本之前的 V8 中,唯一的方法是使用v8::Locker
在从不同线程使用 V8 之前。它保证了两者独家的访问 V8 并初始化存储在 TLS 中的内部结构。欲了解更多详情,请参阅http://code.google.com/p/v8/source/browse/branches/3.1/include/v8.h#3189 http://code.google.com/p/v8/source/browse/branches/3.1/include/v8.h#3189
从V8 3.2版本开始有这样的概念isolate。如果您没有显式创建隔离,V8 会隐式创建默认隔离以保持 API 兼容。在这种情况下你仍然可以简单地使用v8::Locker
与旧版本一样。如果您显式创建隔离,那么除了获取独占访问权限之外v8::Locker
您还必须在线程中显式输入和退出它们v8::Isolate::Enter
/v8::Isolate::Exit
方法或v8::Isolate::Scope
。欲了解更多详情,请参阅http://code.google.com/p/v8/source/browse/trunk/include/v8.h#3510 http://code.google.com/p/v8/source/browse/trunk/include/v8.h#3510
在大多数情况下有效的简单答案是:使用v8::Locker
在从不同线程使用 V8 之前。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)