问题标签 [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.
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
:
使用该代码,如果内存未同步,我希望主线程在某个时候看到共享数组中的陈旧值。但完全有可能(在我看来)这段代码只是碰巧工作,因为消息传递涉及相对较大的时间尺度......
javascript - 如何动态增加 SharedArrayBuffer 的大小
我正在编写一个多线程程序。主线程不断接收网络数据,数据量比较大,所以使用子线程来处理数据。
接收到的数据是一个 100 字节的数据包。每次我收到一个数据包,我都会创建一个 100 字节的数据包SharedArrayBuffer
并通过postMessage()
. 但是主线程接收数据非常快,所以需要频繁调用postMessage通知子线程,导致CPU占用率高...影响主线程的响应速度
所以我在想,如果SharedArraybuffer可以动态增长,接收到的数据不断追加在SharedArrayBuffer的末尾,我只通知子线程一次,这样子线程也可以访问数据。
请问如何动态增加SharedArrayBuffer
. 我试图以链式方式实现它,将 SharedArrayBuffer 对象存储在另一个 SharedArrayBuffer 对象中,但浏览器不允许这样做。
webgl - 如何在 webgl 中设置 SharedArrayBuffer 类型的 bufferData?
我尝试在 webgl 中使用 SharedArrayBuffer 作为 bufferData。
MDN文档告诉我,可以的。
我只是将“ArrayBuffer”更改为“SharedArrayBuffer”,为什么我的代码会吐出错误。
[.WebGL-0x7fc1c209b800]GL 错误:GL_INVALID_OPERATION:glDrawArrays:尝试访问属性 0 中超出范围的顶点
javascript - Javascript Worker - 为什么最近才处理 worker 消息,我可以对它做些什么吗?
我有一个与“主线程”共享一个 SharedArrayBuffer 的 Worker。为了正常工作,我必须确保在主线程访问 SAB 之前,worker 可以访问它。(编辑:创建工人的代码必须在一个单独的函数中(EDIT2:它返回一个指向 SAB 的数组)。)(也许,这已经不可能了,你会告诉我的)。
初始代码如下所示:
worker 代码总是在 after 之后执行test()
,控制台总是显示main
then starting
。
使用超时没有帮助。考虑以下代码test
:
控制台end
首先显示,然后是main
,然后是starting
。
但是,即使没有超时,将缓冲区分配给 test() 函数之外的全局数组也可以完成这项工作。
我的问题如下:
- 为什么发送消息后工作人员不直接启动(=收到?)。AFAIK,工人有自己的事件队列,所以他们不应该依赖主堆栈变空?
- 是否有详细说明工人在发送消息后何时开始工作的规范?
- 有没有办法在不使用全局变量的情况下再次访问 SAB 之前确保工作人员已经启动?(可以使用忙等待,但我要小心......)可能没有办法,但我想确定一下。
编辑
更准确地说:
- 在完全并行运行的场景中,Worker 将能够在消息发布后立即对其进行处理。显然情况并非如此。
- 大多数浏览器 API(而 Worker 就是这样一个 API)使用回调队列来处理对 API 的调用。但是如果应用了这个,消息将在执行超时回调之前发布/处理。
- 更进一步:如果我尝试在 postMessage 之后通过从 SAB 读取直到它更改一个值来忙等待,则会无限地阻塞程序。对我来说,这意味着浏览器 在调用堆栈为空之前不会 发布消息据我所知,这种行为没有记录在案,我无法解释。
总结一下:如果 postMessage 的调用在函数内部,我想知道浏览器如何确定何时发布消息并由工作人员处理。我已经找到了一种解决方法(全局变量),所以我对它在幕后的工作方式更感兴趣。但是,如果有人可以向我展示一个可行的示例,我会接受它。
编辑2:
使用全局变量的代码(运行良好的代码)如下所示
它打印starting
,然后打印main
到控制台。
还值得注意的是:如果我使用 Firefox 浏览器(Chrome 未测试)调试代码,我会在没有全局变量(之前)的情况下得到我想要的结果有人可以解释吗?starting
main
web-worker - WebAssembly 的 postMessage
我想实现一个具有 2 个主要部分的计数器代码:1. 一个计数器工作者,它不断地将 WebAssembly.Memory 作为计数器变量递增,2. 随时从计数器线程读取计数器值的主代码。我想使用 web worker 和 postMessage 来实现此代码以传递计数器的值。WebAssembly.Memory 是计数器的容器,在主代码中定义,并在 counter worker 中增加。事实上,我想像 SharedArrayBuffer 一样使用 WebAssembly.Memory。我的问题是:如何实现代码的worker部分并在JS中增加计数器然后在主代码中读取它?实际上我不想在 WASM 中使用多线程,但我只想在 Javascript 中实现我的目标,因为我相信今天的多线程只是一个测试版,实际上是多任务而不是多线程。并且不可能完全同时运行 2 个线程。
javascript - 是共享 WebAssembly.memory、SharedArrayBuffer 吗?
我们是否可以说如果 WebAssembly.memory 的标志为真,它正是 SahredArrayBuffer?
javascript - javascript sharedArrayBuffer 和按位运算返回 32 位而不是 16 位数字
javascript,2020:我从未使用过 sharedArrayBuffer(或位),我有一些问题。基本上我想在单个 Int16Array 元素上存储一组布尔值和一个小计数器(4 位)。但是当我操纵内存槽时,它看起来像是变成了 32 位。
并在 for(i) 循环中向下:
其中“setBit”函数是:
但这会导致:
十进制:-32768
二进制:11111111111111111000000000000000
当我正在寻找的结果是 16 位数字集的最后一位时:
十进制:32768
二进制:1000000000000000
我不习惯使用按位运算符,我需要屏蔽 +16 位吗?我尝试将索引传递给函数,并且在不将值重新分配给新变量的情况下工作,但这仍然不起作用。
当我安慰我正在应用的面具时,我当然会得到:
十进制:32768
二进制:1000000000000000,
正是我想要的。与以下代码相同:
这似乎有效......所以这里发生了什么,为什么这似乎不适用于 Int16Array?
ios - 我可以在 iOS 上使用 SharedArrayBuffer 吗?
根据 Mozilla 的说法,iOS 上没有浏览器支持跨域打开器策略,这是启用 SharedArrayBuffer 的安全要求之一。这是否意味着我不能将 SharedArrayBuffer 用于 iOS 平台上的任何 Web 应用程序?
javascript - 为什么只有 WebAssembly.Memory.buffer 的 getter?如果缓冲区是 SharedArrayBuffer,底层机制是什么?
因为我们可以通过以下方式将 WebAssembly 内存设置为共享内存WebAssembly.Memory
:
WebAssembly.Memory.buffer
只有一个吸气剂,所以我不能做以下事情:
第一个问题:
有什么理由这样设计吗。我检查了SPEC但没有找到答案。
也许normal SharedArrayBuffer
和 wasm 的底层实现SharedArrayBuffer
虽然它们instanceof
的 s 是相同的?
或者这个设计还有其他结果吗?
第二个问题:
有什么神奇的方法可以把存在SharedArrayBuffer
的WebAssembly.Memory
?
我想这样做是因为我有一个从原始类扩展的新类SharedArrayBuffer
,并且我也想在 wasm 中使用它。