2012-12-02 24 views
18

मैं सदस्य फ़ंक्शन पर std :: async कॉल कैसे संचालित कर सकता हूं?सदस्य फ़ंक्शन पर std :: async का उपयोग कैसे करें?

उदाहरण:

class Person{ 
public: 
    void sum(int i){ 
     cout << i << endl; 
    } 
}; 

int main(int argc, char **argv) { 
    Person person; 
    async(&Person::sum,&person,4); 
} 

मैं async योग करने के लिए कॉल करना चाहते हैं।

Person p; 
call async to p.sum(xxx) 

मुझे पता नहीं चला कि मैं std :: async के साथ ऐसा कर सकता हूं। बूस्ट का उपयोग नहीं करना चाहते हैं। एक लाइन async कॉल तरीका खोज रहे हैं।

+0

[संभावित फ़ंक्शन के साथ प्रारंभ थ्रेड] का संभावित डुप्लिकेट (http://stackoverflow.com/प्रश्न/10673585/स्टार्ट-थ्रेड-सदस्य-फ़ंक्शन) –

उत्तर

17

कुछ इस तरह:

auto f = std::async(&Person::sum, &p, xxx); 

या

auto f = std::async(std::launch::async, &Person::sum, &p, xxx); 

जहां p एक Person उदाहरण है और xxx एक int है।

#include <future> 
#include <iostream> 

struct Foo 
{ 
    Foo() : data(0) {} 
    void sum(int i) { data +=i;} 
    int data; 
}; 

int main() 
{ 
    Foo foo; 
    auto f = std::async(&Foo::sum, &foo, 42); 
    f.get(); 
    std::cout << foo.data << "\n"; 
} 
+1

इसे 'std :: async (और व्यक्ति :: योग, और पी, xxx)' – inf

+1

होना चाहिए और सदस्य कार्यों के लिए अनिवार्य है, लेकिन नि: शुल्क कार्यों के लिए वैकल्पिक है। –

+0

मैंने कोशिश की लेकिन त्रुटि मिली - अमान्य तर्क ' उम्मीदवार हैं: std :: __ async_sfinae_helper :: प्रकार, # 0, # 1 ...> :: async टाइप करें (# 0 &&, # 1 && ...) std :: भविष्य :: टाइप> async (enum std :: launch, # 0 &&, # 1 && ...) ' –

13

ऐसे कई तरीके हैं, लेकिन मैं इसे इस तरह एक लैम्ब्डा उपयोग करने के लिए, सबसे स्पष्ट है लगता है:

int i=42; 
Person p; 
auto theasync=std::async([&p,i]{ return p.sum(i);}); 

यह एक बनाता है

यह सरल डेमो जीसीसी 4.6.3 के साथ काम करता std::future। और कहा कि & पी संदर्भ तक वैध है

http://scrupulousabstractions.tumblr.com/post/36441490955/eclipse-mingw-builds

आप यह सुनिश्चित करें कि पी धागा सुरक्षित है बनाने की जरूरत है: इस की एक पूरी उदाहरण के लिए, मैं MinGW के एक async-सक्षम सेटअप यहाँ सहित एक पूर्ण उदाहरण है async में शामिल हो गया है। (आप एक साझा पॉइंटर, या सी ++ 14 में, एक अनन्य_पीआरआर या यहां तक ​​कि लैम्ब्डा में पी को भी ले जा सकते हैं।)

+0

मैंने कोशिश की लेकिन त्रुटि मिली - अमान्य तर्क 'उम्मीदवार हैं: std :: __ async_sfinae_helper :: प्रकार, # 0, # 1 ...> :: async टाइप करें (# 0 &&, # 1 && .. ।) std :: भविष्य :: टाइप> async (enum std :: launch, # 0 &&, # 1 && ...) ' –

+1

वह त्रुटि वास्तविक त्रुटि नहीं है, यह सिर्फ ग्रहण हो रहा है सी ++ 11 के बारे में। बस आगे बढ़ो और संकलित करें! –

+0

हाँ, मुझे पता है कि यह ग्रहण समस्या है। Juanchopanza उत्तर पर मेरी टिप्पणी देखें। मेरा कुछ कोड सी ++ 11 है और ग्रहण dosnt इसके साथ समस्या है। मुझे पता नहीं चला कि एसिंक के साथ समस्या क्यों है कुछ तरीकों से है। इस तरह async काम - en.cppreference.com/w/cpp/thread/async –

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