为什么这会导致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);
答案 0 :(得分:1)
从Firefox 4(-ish)开始,整个Javascript引擎变得远不那么线程安全,延伸到例如简单的事情,如只是"阅读"并发的字符串可能会导致内存损坏(因为这些读取实际上可能会为字符串绳索实现字符串视图)。
因此,我们决定不再支持调度javascript实现的nsIRunnable
,因为没有安全的方法可以使用它,人们应尽可能切换到ChromeWorkers。
编辑您在评论中说明了您要实施nsIChannel
/ nsIProtocolHandler
。 AFAIK你可以实现nsIProtocolHandler和nsIChannel而不需要任何线程和二进制文件。如果您仍然需要线程和/或二进制文件,那么您的Javascript XPCOM(存根)组件将简单地#34;通过消息传递与ChromeWorker通信(传递ArrayBuffers /类型数组;这些是零拷贝)。然后,ChromeWorker将执行任何繁重的工作,包括任何js-ctypes调用与二进制文件的接口。
答案 1 :(得分:0)
您可以使用(chrome)worker在其他线程上运行非XPCOM JavaScript,并且可以将nsIRunnable的C ++实现分派给其他线程,但是您只能在主线程上使用XPConnect。这是因为XPConnect对象可以循环收集,循环收集器不是线程安全的。