2014-12-14 17 views
5

Sto cercando di utilizzare thread con Emscripten e non capisco come funziona. Ho letto del testo sui web worker e non sono sicuro di capire.Thread using emscripten

Quando prendo uno sguardo nella cartella "test", I can see pthread stuff.

sto usando "std :: filo" ed ha ottenuto il seguente errore:

unresolved symbol: pthread_create 

ho dovuto usare i lavoratori web al posto del filo di default?

Grazie!

risposta

3

Sfortunatamente, il codice multi-thread non può essere compilato con Emscripten. I lavoratori Web consentono il calcolo simultaneo, ma non possono mantenere lo stato condiviso e quindi non possono sostituire i thread.

See: http://kripken.github.io/emscripten-site/docs/porting/guidelines/portability_guidelines.html

Edit: Come altri hanno puntatore fuori, Emscripten si sta muovendo in avanti dal momento che la mia risposta originale, e ora ha il supporto sperimentale per pthreads (e probabilmente presto per C++ incorporato discussioni) https://groups.google.com/forum/#!topic/emscripten-discuss/gQQRjajQ6iY

+2

non è più vero: https://groups.google.com/forum/#! topic/emscripten-discuss/gQQRjajQ6iY – Lightbeard

9

Il supporto per pthread è stato aggiunto e può essere già utilizzato con un po 'di installazione. Poiché std :: thread usa pthread sotto il cofano, puoi usarlo anche tu. Vedere this discussion per ulteriori informazioni.

Cosa dovevo fare:

  • Utilizzare un emscripten più recente (sto testando con 1.34.1)
  • Installare Firefox Nightly
  • attivare il flag USE_PTHREADS
  • essere consapevoli che questo è sperimentale e alcune cose sono pignoli

I was havi ng problemi di scrittura di un esempio pthread che in realtà ha funzionato, ma qui è il codice che utilizza std :: filo che dimostra le funzionalità di base, che ha lavorato per me:

// main.cpp 

#include <thread> 
#include <iostream> 

void func() 
{ 
    std::cout << "I'm a thread!\n"; 
} 

int main() 
{ 
    std::thread test1(func); 
    std::thread test2(func); 
    std::thread test3(func); 

    // join seems to lock up the browser 
    //test1.join(); 
    //test2.join(); 
    //test3.join(); 
} 

sono stato in grado di utilizzare la filettatura in un progetto più ampio (per grande per un post qui!), quindi sono vitali. Non sono così veloci, temo, anche se potrebbe migliorare col tempo.

Per costruirla:

emcc main.cpp -o main.html -s USE_PTHREADS=1 --std=c++11

uscita in Firefox Nightly 42.0a1 (2015/07/16):

Preallocating 1 workers for a pthread spawn pool.
Preallocating 1 workers for a pthread spawn pool.
Preallocating 1 workers for a pthread spawn pool.
I'm a thread!
I'm a thread!
I'm a thread!

+2

Potrei rivedere la mia risposta più tardi, ma [questo problema] (https://github.com/kripken/emscripten/issues/3636) ha un codice pthread funzionante e sta monitorando il congelamento in Firefox Nightly. –