gpt4 book ai didi

c++ - Thread Local Storage 可以伪造/破解吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:12 24 4
gpt4 key购买 nike

我发现自己有点进退两难。

我有一个大型应用程序,其中包含 Google 的 V8 javascript 引擎。一些调用是在 UI 线程上对 V8 引擎进行的。为了像大家推荐的那样对用户友好,一些长时间的操作在单独的线程上运行,而不会挂起 UI 线程。然而,这些长时间运行的操作也会调用 V8 javascript 引擎。所以多个线程调用 V8。

事实是,V8 似乎使用线程本地存储。这似乎让我的应用程序随机爆炸。它绝对属于“到目前为止,这可能是如何运作的?”的类别。错误。

在不显着重新构建我的应用程序的情况下,我提出了一个丑陋、丑陋、可怕的 super hack:我可以让 V8 认为它在不同的线程上运行吗?

换句话说,我第一次调用 V8 时,我记下了线程。然后,对于 对 V8 的所有其他调用,我以某种方式欺骗线程,以便线程本地存储/任何其他线程相关的工作。

可以吗?它会工作吗?我是不是很愚蠢,甚至不考虑这样一个卑鄙的黑客?

最佳答案

你不应该欺骗任何东西。相反,您应该告诉 V8 您正在尝试从不同的线程使用它。

在版本 3.2 之前的 V8 中,唯一的方法是在从不同线程使用 V8 之前使用 v8::Locker。它保证对 V8 的独占 访问并初始化存储在 TLS 中的内部结构。有关详细信息,请参阅 http://code.google.com/p/v8/source/browse/branches/3.1/include/v8.h#3189

从 3.2 版本开始,V8 有了isolate 的概念。如果您没有显式创建 isolate,V8 会隐式创建默认 isolate 以保持 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

在大多数情况下都适用的简单答案是:在从不同线程使用 V8 之前使用 v8::Locker

关于c++ - Thread Local Storage 可以伪造/破解吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7921572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com