SharedArrayBuffer和SharedWorker

时间:2017-06-25 09:01:48

标签: javascript web web-worker ecmascript-2017

在ECMAScript 2017的功能中,有Shared memory and atomics。 我尝试在Google Chrome 59.0.3071.109中测试它(已启用实验SharedArrayBuffer标志)。 当我尝试在简单的工作室中发布SharedArrayBuffer时,它可以正常工作。但是当我尝试在SharedWorker中发布SharedArrayBuffer时,在onmessage事件处理程序的事件参数中,我得到event.data为null。为什么会这样?以下是我的代码示例:

的index.html:

<!doctype html>

<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Web Workers</title>
    <script src="main.js"></script>
</head>

<body>

<button onclick="post()">Post</button>
<button onclick="get()">Get</button>

</body>
</html>

main.js:

var worker = new SharedWorker('worker.js');
var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
new Int32Array(buffer)[0] = 12;

function post() {
    worker.port.postMessage({buffer});
}

function get() {
    console.log(new Int32Array(buffer)[0]);
}

worker.js:

self.onconnect = function (e) {
    var [port] = e.ports;

    port.onmessage = function (e) {
        console.log(e.data);// null
    };
};

谢谢。

1 个答案:

答案 0 :(得分:0)

根据铬Blink Workers的记录,显示:共享的工作进程外。

它在不同于文档进程(包含JS主线程)的另一个系统进程上运行。

操作系统进程拒绝其他进程的内存访问。

SharedArraybuffer通过共享(访问)内存工作。因此,SharedArraybuffer不能通过Shared Worker(进程外)访问JS mainthread(文档进程)创建(访问)。