3

I'd like to compile the following C++ snippet using threads with Emscripten

    #include <cstdio>
    #include <thread>
    
    void foo() { puts("foo\n"); }
    
    void bar(int x) { printf("bar %d\n", x); }
    
    int main(int argc, char* argv[]) {
      std::thread first(foo);
      std::thread second(bar, 123);
    
      puts("main, foo and bar now execute concurrently...\n");
    
      first.join();
      second.join();
    
      puts("foo and bar completed.\n");
    }

To get Emscripten to use threads I pass the "-s USE_PTHREADS=1" option during compilation and linking

  target_compile_options(
    Emscripten PRIVATE -v "SHELL:-s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=8")
  target_link_options(
    Emscripten PRIVATE -v --emrun
    "SHELL:-s MINIFY_HTML=0 -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=8")

I also change the suffix of the compilation output to .html which leads to Emscripten directly producing a .html page

  set(CMAKE_EXECUTABLE_SUFFIX ".html")

So far so good. The snippet compiles as expected and I can see the toolchain passing some pthread arguments on the command line.

In order to test the output I fire up a webserver with python and open the .html page with Firefox. The Firefox option javascript.options.shared_memory was enabled by default in my version (78.0.1) so I thought that my code should work out of the box. Sadly this isn't the case and I'm getting Uncaught ReferenceError: SharedArrayBuffer is not defined exceptions thrown at me through the console.

Testing the code with node works though:

$ node --experimental-wasm-threads --experimental-wasm-bulk-memory Emscripten.js
main, foo and bar now execute concurrently...

foo
bar 123

foo and bar completed.

/edit Ok, seems like SharedArrayBuffer still undergoes some standardization process... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/Planned_changes

Vinci
  • 1,382
  • 10
  • 12

0 Answers0