2012-12-02 62 views
18

Làm cách nào để vận hành std :: gọi async trên một hàm thành viên?Làm thế nào để sử dụng std :: async trên một chức năng thành viên?

Ví dụ:

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

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

Tôi muốn gọi tới tổng async.

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

Tôi không biết liệu tôi có thể làm điều đó với std :: async không. Không muốn sử dụng tăng. Tìm kiếm một cách gọi async một dòng.

+0

có thể trùng lặp của [Bắt đầu thread với chức năng thành viên] (http://stackoverflow.com/question/10673585/start-thread-with-member-function) –

Trả lời

17

Something như thế này:

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

hoặc

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

nơi p là một trường hợp Personxxx là một int.

bản demo đơn giản này làm việc với GCC 4.6.3:

#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

Nó cần phải là 'std :: async (& Person :: sum, & p, xxx)' – inf

+1

& là bắt buộc đối với các chức năng thành viên, nhưng tùy chọn cho các chức năng miễn phí. –

+0

Tôi đã thử nhưng đã nhận lỗi - Đối số không hợp lệ ' Ứng viên là: std :: __ async_sfinae_helper :: type, # 0, # 1 ...> :: type async (# 0 &&, # 1 && ...) std :: tương lai :: type> async (enum std :: launch, # 0 &&, # 1 && ...) ' –

13

Có một số cách, nhưng tôi thấy nó rõ ràng nhất để sử dụng một lambda, như thế này:

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

này tạo ra một std::future. Đối với một ví dụ hoàn chỉnh điều này, tôi có một ví dụ đầy đủ bao gồm một thiết lập async-khả năng mingw đây:

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

Bạn cần phải chắc chắn rằng p là chủ đề an toàn và rằng p tham khảo & có giá trị đến async được nối. (Bạn cũng có thể giữ p với một con trỏ chia sẻ, hoặc trong c + + 14, một unique_ptr hoặc thậm chí di chuyển p vào lambda.)

+0

Tôi đã thử nhưng có lỗi - Đối số không hợp lệ 'Ứng viên là: std :: __ async_sfinae_helper :: type, # 0, # 1 ...> :: type async (# 0 &&, # 1 && .. .) std :: tương lai :: type> async (enum std :: launch, # 0 &&, # 1 && ...) ' –

+1

Lỗi đó không phải là lỗi thực sự, nó chỉ là nhật thực bị nhầm lẫn về C++ 11. Chỉ cần tiếp tục và biên dịch nó! –

+0

Vâng, tôi hiểu rằng đây là vấn đề nhật thực. Xem bình luận của tôi về câu trả lời juanchopanza. Một số mã của tôi là C++ 11 và eclipse dosnt có vấn đề với nó. Tôi đã không hiểu tại sao nó có vấn đề với async là những cách nhất định. theo cách này hoạt động không đồng bộ - en.cppreference.com/w/cpp/thread/async –

Các vấn đề liên quan