2014-12-14 6 views
5

Ich versuche Thread mit Emscripten zu verwenden und ich verstehe nicht, wie es funktioniert. Ich habe etwas über Web-Arbeiter gelesen und bin mir nicht sicher, ob ich das verstehe.Thread mit emscripten

Wenn ich einen Blick in "Tests" Ordner, I can see pthread stuff.

Ich verwende "std :: thread" und bekam die folgende Fehlermeldung:

unresolved symbol: pthread_create 

Habe ich habe stattdessen Thread von Standard-Web-Arbeiter benutzen?

Danke!

Antwort

3

Leider kann Multi-Thread-Code nicht mit Emscripten kompiliert werden. Web-Worker ermöglichen eine gleichzeitige Berechnung, können jedoch keinen gemeinsamen Status beibehalten und können daher Threads nicht ersetzen.

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

bearbeiten: Wie andere aus Zeigern haben, ist Emscripten vorwärts seit meiner ursprünglichen Antwort zu bewegen, und hat nun experimentelle Unterstützung für pThreads (und wahrscheinlich bald für C++ Einbau-Threads) https://groups.google.com/forum/#!topic/emscripten-discuss/gQQRjajQ6iY

+2

nicht mehr wahr: https://groups.google.com/forum/#! topic/emscripten-discuss/gQQRjajQ6iY – Lightbeard

9

Die Unterstützung für Pthread wird hinzugefügt und kann bereits mit ein wenig Setup verwendet werden. Da std :: thread Pthread unter der Haube verwendet, können Sie es auch verwenden. Weitere Informationen finden Sie unter this discussion.

Was hatte ich zu tun:

  • Verwenden Sie eine neuere Emscripten (Ich bin mit 1.34.1 Prüfung)
  • Installieren Firefox Nightly
  • das Flag aktivieren USE_PTHREADS
  • Seien Sie aufmerksam, dass Dies ist experimentell und einige Dinge sind knifflig

Ich war havi ng Probleme Schreiben eines Pthread Beispiel oben, die tatsächlich lief, aber hier ist Code std :: Thread, der die Grundfunktionalität demonstriert, die für mich gearbeitet:

// 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(); 
} 

Ich habe das Einfädeln in einem größeren Projekt verwenden konnten (zu groß für einen Posten hier!), also sind sie lebensfähig. Sie sind nicht so schnell, fürchte ich, obwohl sich das mit der Zeit verbessern könnte.

es zu bauen:

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

Output 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

Ich könnte meine Antwort später revidieren, aber [diese Ausgabe] (https://github.com/kripken/emscripten/issues/3636) hat funktionierenden Pthread-Code und verfolgt das Einfrieren in Firefox jeden Abend. –

Verwandte Themen