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 実装のディスパッチはサポートされなくなり、可能であれば ChromeWorkersに切り替える必要があると判断されました。

編集nsIChannel/を実装したいとコメントで述べましたnsIProtocolHandler。私の知る限り、スレッドやバイナリなしで nsIProtocolHandler と nsIChannel を実装できます。それでもスレッドやバイナリが必要な場合、Javascript XPCOM (スタブ) コンポーネントは、メッセージ パッシング (ArrayBuffers/型付き配列を渡す; これらはゼロ コピーです) を介して ChromeWorker と「単純に」通信します。その後、ChromeWorker はあらゆる重労働を行います。バイナリとのインターフェースのためのjs-ctypes呼び出し。

于 2013-10-14T20:43:05.880 に答える
0

(chrome) ワーカーを使用して、他のスレッドで非 XPCOM JavaScript を実行できます。また、nsIRunnable の C++ 実装を他のスレッドにディスパッチできますが、XPConnect はメイン スレッドでのみ使用できます。これは、XPConnect オブジェクトがサイクル収集される可能性があり、サイクル コレクターがスレッドセーフではないためです。

于 2013-10-10T23:35:25.593 に答える