2012-08-01 31 views
22

Başka bir sınıf üyesini birden çok kez paralel olarak çağıran bir sınıf üyesi yazmayı deniyorum.Sınıf ve std :: C++ sınıf üyesindeki async

Sorunun basit bir örneğini yazdım ve bunu derleyemiyorum bile. Std :: async çağrısı ile ne yapıyorum? Sanırım sorun, işlevi nasıl geçtiğimle ilgili olurdu.

#include <vector> 
#include <future> 
using namespace std; 
class A 
{ 

int a,b; 
public: 
A(int i=1, int j=2){ a=i; b=j;} 

std::pair<int,int> do_rand_stf(int x,int y) 
{ 
    std::pair<int,int> ret(x+a,y+b); 
    return ret; 
} 

void run() 
{ 
    std::vector<std::future<std::pair<int,int>>> ran; 
    for(int i=0;i<2;i++) 
    { 
     for(int j=0;j<2;j++) 
     { 
      auto hand=async(launch::async,do_rand_stf,i,j); 
      ran.push_back(hand);  
     } 
    } 
    for(int i=0;i<ran.size();i++) 
    { 
     pair<int,int> ttt=ran[i].get(); 
     cout << ttt.first << ttt.second << endl; 
    } 
} 
}; 
int main() 
{ 
A a; 
a.run(); 
} 

derleme: (. Örtülü this parametresi)

g++ -std=c++11 -pthread main.cpp 
+0

Geçiş '* this' async'' üçüncü parametre olarak. – Xeo

+1

Derlemede veya bağlantıda hata yaparsanız, söz konusu hataları söz konusu olmak üzere tercihen verbatim olarak eklemeniz iyi olur. –

+0

Artık C++ 11 ile pthread kullanmanıza gerek yok :) Thats C++ 11 (threading) içindeki en büyük katkılardan biri. Eşzamansız başlatma ve açık iş parçacığı da dilin kendisinde ise, async() örtük bir iş parçacığıdır. – siddhusingh

cevap

38

do_rand_stf bir statik olmayan üye fonksiyonudur ve böylece sınıf örneği olmadan denilen olamaz Neyse ki, std::asyncstd::bind gibi parametrelerini kolları ve bind, bir üye işlev göstericisini açık bir this parametresini alan bir işleve dönüştürmek için std::mem_fn'u kullanabilir, bu nedenle yapmanız gereken tek şey this değerinigeçirmektir.çağırma ve do_rand_stf geçerken geçerli üye işlev işaretçisi sözdizimini kullanın: kodunda başka sorunlar olsa vardır

auto hand=async(launch::async,&A::do_rand_stf,this,i,j); 

. Öncelikle ve std::endl'u #include kullanarak <iostream> kullanın. Daha ciddi olarak, std::future, yalnızca hareketli olabilir, bu nedenle hand belirtilen nesneyi std::move kullanmadan yapamazsınız. Alternatif olarak, sadece doğrudan push_back için async sonucu geçmesi: Yeni konuya this işaretçi geçebilir

ran.push_back(async(launch::async,&A::do_rand_stf,this,i,j)); 
+0

Teşekkürler, bu her şeyi çözdü. :) – UldisK

+0

Çok iyi bir açıklama @JohannesD – siddhusingh

+0

hayatımı kurtardın. Teşekkürler – Porizm

1

:

async([this]() 
{ 
    Function(this); 
}); 
+0

Belki bir şeyi özlüyorum, ama bu 'bu' ve 'bu' farklı kılan nedir? İç iplik 'bu' dış iplik gibi 'bu' ile aynıdır, çünkü yakalanmadıkça hiç bir iç iplik olmamalıdır. Daha çok javascript hilesi gibi geliyor… –

+1

'this_thread :: get_id()' thread id farkını görmenin bir yolu bu değil. Eğer yakalamıyorsan, lambdada mevcut olmayacak. Burada olduğu gibi - http://ideone.com/uWNs4p - 'bunu' yakalamanız gerekiyor. Ve eğer yaparsanız, bu lambda dışında farklı değil - http://ideone.com/YuPKf9 –

+1

@ MichaelKrelin-hacker Doğru, en azından gcc: http://ideone.com/G9icfv kullanıyordum Görsel stüdyo; bununla farklı şekilde çalışabilmesi mümkün. – Andrew

İlgili konular