2014-12-14 3 views
5

का उपयोग करके थ्रेड मैं ईएमएसस्क्रिप्ट के साथ धागे का उपयोग करने की कोशिश कर रहा हूं और मुझे समझ में नहीं आता कि यह कैसे काम करता है। मैंने वेब श्रमिकों के बारे में कुछ पाठ पढ़ा है और मुझे समझने की ज़रूरत नहीं है।emscripten

जब मैं "परीक्षण" फ़ोल्डर, I can see pthread stuff में एक नज़र डालता हूं।

मैं "std :: सूत्र" का उपयोग कर रहा है और निम्नलिखित त्रुटि मिली:

unresolved symbol: pthread_create 

क्या मैं डिफ़ॉल्ट थ्रेड के बजाय वेब श्रमिकों उपयोग करना पड़ेगा?

धन्यवाद!

उत्तर

3

दुर्भाग्यवश, बहु-थ्रेड कोड को Emscripten के साथ संकलित नहीं किया जा सकता है। वेब श्रमिक एक साथ गणना की अनुमति देते हैं, लेकिन वे साझा स्थिति को बनाए नहीं रख सकते हैं और इस प्रकार धागे के लिए प्रतिस्थापित नहीं कर सकते हैं।

देखें: http://kripken.github.io/emscripten-site/docs/porting/guidelines/portability_guidelines.html

संपादित: दूसरों को बाहर सूचक है के रूप में, Emscripten मेरी मूल जवाब के बाद से आगे बढ़ रहा है, और अब pthreads के लिए प्रयोगात्मक समर्थन है (और संभावना के लिए जल्द ही सी ++ में निर्मित धागे) https://groups.google.com/forum/#!topic/emscripten-discuss/gQQRjajQ6iY

+2

नहीं रह गया है सच: https://groups.google.com/forum/#! विषय/emscripten- चर्चा/gQQRjajQ6iY – Lightbeard

9

पाथ्रेड के लिए समर्थन जोड़ा जा रहा है और पहले से ही कुछ सेटअप के साथ उपयोग किया जा सकता है। चूंकि std :: thread हुड के नीचे pthread का उपयोग कर रहा है, आप इसका भी उपयोग कर सकते हैं। अधिक जानकारी के लिए this discussion देखें।

मैं करना था क्या:

  • एक नए emscripten (मैं 1.34.1 के साथ परीक्षण कर रहा हूँ) का उपयोग करें
  • स्थापित Firefox Nightly
  • झंडा USE_PTHREADS सक्षम
  • कि प्रति जागरूक रहें यह प्रयोगात्मक है और कुछ चीजें परिष्कृत हैं

मैं थावी था (करने के लिए

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

मैं एक बड़ी परियोजना में सूत्रण का उपयोग करने में सक्षम है: एनजी मुसीबत कोड std :: धागा बुनियादी कार्यक्षमता जो मेरे लिए काम किया दर्शाता उपयोग कर रहा है एक pthread उदाहरण है कि वास्तव में भाग गया लिखाई, लेकिन यहाँ यहां एक पोस्ट के लिए बड़ा!), इसलिए वे व्यवहार्य हैं। वे सब तेज़ नहीं हैं, मुझे डर है, हालांकि यह समय के साथ सुधार सकता है।

इसे बनाने के लिए:

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

फ़ायरफ़ॉक्स में आउटपुट रात 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

मैं बाद में अपना उत्तर संशोधित कर सकता हूं, लेकिन [इस मुद्दे] (https://github.com/kripken/emscripten/issues/3636) में पर्थ्रेड कोड काम कर रहा है और इसमें ठंड लग रहा है फ़ायरफ़ॉक्स नाइटली। –

संबंधित मुद्दे