首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何动态增加SharedArrayBuffer的大小

如何动态增加SharedArrayBuffer的大小
EN

Stack Overflow用户
提问于 2018-10-07 10:18:45
回答 2查看 647关注 0票数 0

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

接收到的数据是一个100字节的数据包。每次收到数据包时,我都会创建一个100字节的SharedArrayBuffer,并通过postMessage()将其发送给子线程。但是主线程接收数据的速度非常快,需要频繁地调用postMessage来通知子线程,这导致CPU usage...affecting主线程的响应速度很高。

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

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

EN

回答 2

Stack Overflow用户

发布于 2018-10-10 12:14:01

我想问一下如何动态增加SharedArrayBuffer的长度。

来自MDN web docs (重点是我的)。

“SharedArrayBuffer对象用于表示通用的、固定长度的原始二进制数据缓冲区,类似于ArrayBuffer对象,但在某种程度上可用于在共享内存上创建视图。”

固定长度意味着你不能调整it...so的大小,它没有resize()方法也就不足为奇了。

(注意:我确实想到了一件事,那就是我相信SharedArrayBuffer有一种非常新的能力可以在WebAssembly中作为使用,它有一个grow_memory运算符。我认为利用这一点将是非常困难的,如果它是可能的,如果它是可能的,那么很可能在许多浏览器中都不支持它。)

我曾尝试以链接的方式实现它,将SharedArrayBuffer对象存储在另一个SharedArrayBuffer对象中,但浏览器不允许这样做。

不是的。你只能写数字。

看起来您可以使用一个数字来索引SharedArrayBuffers表,并以这种方式将它们链接起来。

因此,无论您做什么,无论哪个线程决定更新共享缓冲结构,都需要以某种方式通知其他线程更新。为了使该通知能够传输SharedArrayBuffers,它必须使用postMessage来完成此操作。

您是否考虑过在开始时尝试分配一个更大的SharedArrayBuffer,并将其视为circular buffer,以便主线程以“生产者/消费者”模式读出子线程正在进行的写操作?

如果你坚持实现大小调整,你可以考虑让缓冲区的某一部分保留一个“过时”的指示器,并且必须从调整它大小的线程请求一个新的指示器。您必须使用同步来控制这一点。如果你制作了一个小样本来做这件事,它可能会成为一个很好的技术article...and如果你对小样本有问题,它将是这里进一步问题的一个很好的基础。

票数 0
EN

Stack Overflow用户

发布于 2020-11-12 22:18:44

没有办法调整大小,只能通过类型化数组进行复制。

但是直到RAM被实际使用,才实际分配ram。在Node.js (v14.14.0)下,您可以看到ram使用率是如何随着缓冲区的填满而逐渐增加的,或者如果使用array.fill,它基本上是如何立即被使用的。

代码语言:javascript
复制
const sharedBuffer = new SharedArrayBuffer(512 * 1024 * 1024)
const array = new Uint8Array(sharedBuffer)

// array.fill(1) // Causes ram to be allocated right away
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52684936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档