问题标签 [sharedarraybuffer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
407 浏览

javascript - `postMessage` 或屈服于事件循环或类似的同步共享内存吗?

我在JavaScript规范提议SharedArrayBuffer的与处理消息。(一个已经将共享内存发送到另一个之后。)但是,我也无法通过实验验证它不会发生(在我的测试中,我没有看到陈旧的值)。是否有一些我错过的保证,如果有,在哪里保证?例如,它是否记录在postMessage我错过了它,或者是否有一些关于返回到事件循环/作业队列来保证它(因为处理来自另一个线程的消息涉及这样做)等等?或者,是否绝对不能保证(并且该信息在某处的规范中)?

不要推测或做出“合理的猜测”。我正在寻找确凿的信息:来自规范来源的引文,一个可复制的实验,表明它不能保证(尽管我认为它是否只是一个实现错误的问题),诸如此类的事情。


下面是我的测试的源代码,这些测试还不能捕获不同步的内存。要运行它,您需要使用当前支持的浏览器,SharedArrayBuffer我认为目前这意味着 Chrome v67 或更高版本(Firefox、Edge 和 Safari 都支持,但为了响应 2018 年 1 月的 Spectre 和 Meltdown 而禁用了它; Chrome 也这样做了,但在 v67 [2018 年 7 月] 在启用了站点隔离功能的平台上重新启用了它)。

sync-test-postMessage.html

sync-test-postMessage-main.js

sync-test-postMessage-worker.js

使用该代码,如果内存未同步,我希望主线程在某个时候看到共享数组中的陈旧值。但完全有可能(在我看来)这段代码只是碰巧工作,因为消息传递涉及相对较大的时间尺度......

0 投票
2 回答
744 浏览

javascript - 如何动态增加 SharedArrayBuffer 的大小

我正在编写一个多线程程序。主线程不断接收网络数据,数据量比较大,所以使用子线程来处理数据。

接收到的数据是一个 100 字节的数据包。每次我收到一个数据包,我都会创建一个 100 字节的数据包SharedArrayBuffer并通过postMessage(). 但是主线程接收数据非常快,所以需要频繁调用postMessage通知子线程,导致CPU占用率高...影响主线程的响应速度

所以我在想,如果SharedArraybuffer可以动态增长,接收到的数据不断追加在SharedArrayBuffer的末尾,我只通知子线程一次,这样子线程也可以访问数据。

请问如何动态增加SharedArrayBuffer. 我试图以链式方式实现它,将 SharedArrayBuffer 对象存储在另一个 SharedArrayBuffer 对象中,但浏览器不允许这样做。

0 投票
1 回答
177 浏览

webgl - 如何在 webgl 中设置 SharedArrayBuffer 类型的 bufferData?

我尝试在 webgl 中使用 SharedArrayBuffer 作为 bufferData。

MDN文档告诉我,可以的。

我只是将“ArrayBuffer”更改为“SharedArrayBuffer”,为什么我的代码会吐出错误。

[.WebGL-0x7fc1c209b800]GL 错误:GL_INVALID_OPERATION:glDrawArrays:尝试访问属性 0 中超出范围的顶点

0 投票
1 回答
1809 浏览

javascript - 如何在 Javascript 中将“ArrayBuffer”转换为“SharedArrayBuffer”?

采取以下代码段:

如何将此ArrayBuffer转换为SharedArrayBuffer

0 投票
2 回答
160 浏览

javascript - Javascript Worker - 为什么最近才处理 worker 消息,我可以对它做些什么吗?

我有一个与“主线程”共享一个 SharedArrayBuffer 的 Worker。为了正常工作,我必须确保在主线程访问 SAB 之前,worker 可以访问它。(编辑:创建工人的代码必须在一个单独的函数中(EDIT2:它返回一个指向 SAB 的数组)。)(也许,这已经不可能了,你会告诉我的)。

初始代码如下所示:

worker 代码总是在 after 之后执行test(),控制台总是显示mainthen starting

使用超时没有帮助。考虑以下代码test

控制台end首先显示,然后是main,然后是starting

但是,即使没有超时,将缓冲区分配给 test() 函数之外的全局数组也可以完成这项工作。

我的问题如下:

  • 为什么发送消息后工作人员不直接启动(=收到?)。AFAIK,工人有自己的事件队列,所以他们不应该依赖主堆栈变空?
  • 是否有详细说明工人在发送消息后何时开始工作的规范?
  • 有没有办法在不使用全局变量的情况下再次访问 SAB 之前确保工作人员已经启动?(可以使用忙等待,但我要小心......)可能没有办法,但我想确定一下。

编辑

更准确地说:

  • 在完全并行运行的场景中,Worker 将能够在消息发布后立即对其进行处理。显然情况并非如此。
  • 大多数浏览器 API(而 Worker 就是这样一个 API)使用回调队列来处理对 API 的调用。但是如果应用了这个,消息将在执行超时回调之前发布/处理。
  • 更进一步:如果我尝试在 postMessage 之后通过从 SAB 读取直到它更改一个值来忙等待,则会无限地阻塞程序。对我来说,这意味着浏览器 在调用堆栈为空之前不会 发布消息据我所知,这种行为没有记录在案,我无法解释。

总结一下:如果 postMessage 的调用在函数内部,我想知道浏览器如何确定何时发布消息并由工作人员处理。我已经找到了一种解决方法(全局变量),所以我对它在幕后的工作方式更感兴趣。但是,如果有人可以向我展示一个可行的示例,我会接受它。

编辑2:

使用全局变量的代码(运行良好的代码)如下所示

它打印starting,然后打印main到控制台。

还值得注意的是:如果我使用 Firefox 浏览器(Chrome 未测试)调试代码,我会在没有全局变量(之前)的情况下得到我想要的结果有人可以解释吗?startingmain

0 投票
0 回答
345 浏览

web-worker - WebAssembly 的 postMessage

我想实现一个具有 2 个主要部分的计数器代码:1. 一个计数器工作者,它不断地将 WebAssembly.Memory 作为计数器变量递增,2. 随时从计数器线程读取计数器值的主代码。我想使用 web worker 和 postMessage 来实现此代码以传递计数器的值。WebAssembly.Memory 是计数器的容器,在主代码中定义,并在 counter worker 中增加。事实上,我想像 SharedArrayBuffer 一样使用 WebAssembly.Memory。我的问题是:如何实现代码的worker部分并在JS中增加计数器然后在主代码中读取它?实际上我不想在 WASM 中使用多线程,但我只想在 Javascript 中实现我的目标,因为我相信今天的多线程只是一个测试版,实际上是多任务而不是多线程。并且不可能完全同时运行 2 个线程。

0 投票
0 回答
256 浏览

javascript - 是共享 WebAssembly.memory、SharedArrayBuffer 吗?

我们是否可以说如果 WebAssembly.memory 的标志为真,它正是 SahredArrayBuffer?

0 投票
1 回答
34 浏览

javascript - javascript sharedArrayBuffer 和按位运算返回 32 位而不是 16 位数字

javascript,2020:我从未使用过 sharedArrayBuffer(或位),我有一些问题。基本上我想在单个 Int16Array 元素上存储一组布尔值和一个小计数器(4 位)。但是当我操纵内存槽时,它看起来像是变成了 32 位。

并在 for(i) 循环中向下:

其中“setBit”函数是:

但这会导致:

十进制:-32768

二进制:11111111111111111000000000000000

当我正在寻找的结果是 16 位数字集的最后一位时:

十进制:32768

二进制:1000000000000000

我不习惯使用按位运算符,我需要屏蔽 +16 位吗?我尝试将索引传递给函数,并且在不将值重新分配给新变量的情况下工作,但这仍然不起作用。

当我安慰我正在应用的面具时,我当然会得到:

十进制:32768

二进制:1000000000000000,

正是我想要的。与以下代码相同:

这似乎有效......所以这里发生了什么,为什么这似乎不适用于 Int16Array?

0 投票
6 回答
827 浏览

ios - 我可以在 iOS 上使用 SharedArrayBuffer 吗?

根据 Mozilla 的说法,iOS 上没有浏览器支持跨域打开器策略,这是启用 SharedArrayBuffer 的安全要求之一。这是否意味着我不能将 SharedArrayBuffer 用于 iOS 平台上的任何 Web 应用程序?

0 投票
1 回答
172 浏览

javascript - 为什么只有 WebAssembly.Memory.buffer 的 getter?如果缓冲区是 SharedArrayBuffer,底层机制是什么?

因为我们可以通过以下方式将 WebAssembly 内存设置为共享内存WebAssembly.Memory

WebAssembly.Memory.buffer只有一个吸气剂,所以我不能做以下事情:

第一个问题

有什么理由这样设计吗。我检查了SPEC但没有找到答案。

也许normal SharedArrayBuffer和 wasm 的底层实现SharedArrayBuffer虽然它们instanceof的 s 是相同的?

或者这个设计还有其他结果吗?

第二个问题

有什么神奇的方法可以把存在SharedArrayBufferWebAssembly.Memory

我想这样做是因为我有一个从原始类扩展的新类SharedArrayBuffer,并且我也想在 wasm 中使用它。