0

为什么这会导致 FireFox 崩溃?将此代码复制并粘贴到浏览器控制台 ( Ctrl+Shift+J) 中:

function TestRunner(){}
TestRunner.prototype={
    classDescription:"TestRunner",
    classID:Components.ID("{09AA3487-7531-438D-B0B2-80BC24B584C0}"),
    contractID:"@yoy.be/TestRunner;1",
    QueryInterface:XPCOMUtils.generateQI([Components.interfaces.nsIRunnable]),
    run:function(){
        console.log("ping");
    }
};
Components.classes["@mozilla.org/thread-manager;1"].getService().newThread(0).dispatch(new TestRunner(),0);
4

2 回答 2

1

从 Firefox 4(-ish) 开始,整个 Javascript 引擎的线程安全性大大降低,延伸到诸如同时“读取”字符串之类的简单事情可能会导致内存损坏(因为这些读取实际上可能会为字符串绳索实现字符串视图) )。

因此决定nsIRunnable不再支持调度 javascript-implemented,因为没有安全的使用方式,人们应该尽可能切换到ChromeWorkers

编辑您在评论中说您要实施nsIChannel/ nsIProtocolHandler。AFAIK 您可以在没有任何线程和二进制文件的情况下实现 nsIProtocolHandler 和 nsIChannel。如果您仍然需要线程和/或二进制文件,那么您的 Javascript XPCOM(存根)组件将通过消息传递“简单地”与 ChromeWorker 通信(传递 ArrayBuffers/类型化数组;这些是零拷贝)。ChromeWorker 然后会做任何繁重的工作,包括。任何与二进制文件交互的js-ctypes调用。

于 2013-10-14T20:43:05.880 回答
0

您可以使用 (chrome) 工作线程在其他线程上运行非 XPCOM JavaScript,并且可以将 nsIRunnable 的 C++ 实现分派给其他线程,但您只能在主线程上使用 XPConnect。这是因为 XPConnect 对象可能是循环收集的,而循环收集器不是线程安全的。

于 2013-10-10T23:35:25.593 回答