2012-12-02 18 views
18

std :: async çağrısını üye işlevinde nasıl çalıştırabilirim?Bir üye işlevinde std :: async nasıl kullanılır?

Örnek:

Ben asenk toplamak aramak istediğiniz
class Person{ 
public: 
    void sum(int i){ 
     cout << i << endl; 
    } 
}; 

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

.

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

Std :: async ile yapıp yapamayacağımı anlayamadım. Takviye kullanmak istemezsiniz. Tek satırlı bir eşzamanlama arama yolu arıyorum. Böyle

+0

[Üye işlevli iş parçacığı başla] olası bir kopyası (http://stackoverflow.com/questions/10673585/start-thread-with-member işlev) –

cevap

17

şey:

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

veya p bir Person örneğidir ve xxx bir int olduğunu

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

.

#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 (& Person :: sum, & p, xxx) ' – inf

+1

olmalıdır ve üye işlevleri için zorunlu, ancak ücretsiz işlevler için isteğe bağlı olması gerekir. –

+0

Denedim ama hata var - Geçersiz argümanlar ' Adaylar şunlardır: std :: __ async_sfinae_helper :: type async (# 0 &&, # 1 && ...) std :: future :: type> async (enum std :: başlatma, # 0 &&, # 1 && ...) ' –

13

Orada birkaç yolu vardır, ama böyle bir lambda kullanmak en açık bulmak:

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

Bu yaratır

Bu basit demo GCC 4.6.3 ile çalışır std::future.

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

Sen p güvenli parçacığı olduğundan emin olmak gerekir ve & p referans kadar geçerli olduğunu: Bu tam bir Örneğin, ben burada MinGW bir zaman uyumsuz özellikli Kurulum dahil olmak üzere tam bir örnek var async birleştirildi. (Ayrıca, paylaşılan bir işaretçi ile p veya C++ 14, bir unique_ptr tutabilir veya hatta lambda p taşıyabilirsiniz.)

+0

Denedim ama hata var - Geçersiz argümanlar 'Adaylar: std :: __ async_sfinae_helper :: type, # 0, # 1 ...> :: type async (# 0 &&, # 1 && .. .) std :: future :: type> async (enum std :: başlatma, # 0 &&, # 1 && ...) ' –

+1

Bu hata gerçek bir hata değil, sadece karıştığında tutulma var C++ 11 hakkında. Sadece devam et ve derleyin! –

+0

Evet, bunun tutulma problemi olduğunu anlıyorum. Juanchopanza cevabı hakkındaki yorumumu görün. Benim kodumun bir kısmı C++ 11 ve eclipse dosnt'in onunla bir sorunu var. Async ile niçin bir problemi olduğunu anlayamadım. bu şekilde asenkron çalışma - en.cppreference.com/w/cpp/thread/async –

İlgili konular