我可以用Emterpreter“伪造”线程吗?

时间:2019-01-08 00:15:07

标签: multithreading asynchronous pthreads emscripten

我正在移植一个项目以进行脚本化。该项目有几个非关键线程,它们只执行几个低优先级的事情。线程功能的速度不是问题。但是,它们确实需要在不阻止程序的情况下发生。

我正在使用EMTERPRETIFY并将这些非关键功能列入白名单。

我可以打电话给Emterpreter模拟线程吗?即将几个周期投入到线程函数中,然后返回主程序?

我以为我要使用emscripten_async_call,但是一旦函数被激发,它将一直阻塞直到函数完成。

有没有一种方法可以让我的解释函数同时运行?

1 个答案:

答案 0 :(得分:1)

一些我知道的选项:

首先,您可以手动转换

void *thread_fn(void *) {
  // init
  while (true) {
    // do work
  }
}

进入初始化和工作功能(以及原始情况下的第三个粘合功能),然后手动序列化执行(就像您编写的一样):先调用一个“工作功能”,然后再调用另一个,然后再依次类推,等等。

另一种选择,一种可能会成功的半自动方式:使用GNU Pth,您可以在单个OS线程内模拟多线程。我可以想象,它是用协程精确完成的。如果成功将GNU Pth移植到Emscripten的协程,那么您将自动在某些系统调用(?)上隐式切换仿真线程。我仍然不确定这种方法,但是如果您将此库移植到Emscripten,则可能会获得足够的信息以了解如何分隔主要的高优先级线程。

我个人在将QEMU移植到Emscripten时就使用了第一种方法(虽然可行,但存在一些故障)。我使用第二种方法对本机代码进行单线程处理,但我从未将其与Emscripten一起使用,因此您已经被警告 :) -很有前途,但它可能需要做一些工作最终会花费很多时间...无论如何,序列化某些多线程代码似乎并不是一定可以成功的简单任务,这取决于...

同时,浏览器中已经有共享内存多线程支持。 AFAIK,它在Meltdown&Spectre之后被重新禁用。我不知道它是否已经重新启用(如果可能的话)。