2010-12-13 30 views
6

Tôi đang thử nghiệm về chức năng std :: async với mã từ http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.htmlchức năng không đồng bộ gọi C++ 0x

int calculate_the_answer_to_LtUaE(){ 
    sleep(5); 
cout << "Aaa" << endl; 
} 

    std::future<int> the_answer=std::async(calculate_the_answer_to_LtUaE); 
    the_answer.get(); 
    cout << "finish calling" << endl; 
    sleep(10000); 

tôi cần phải gọi the_answer.get() để gọi calculate_the_answer_to_LtUaE() và nhận được Aaa in trên màn hình. Nếu tôi nhận xét ra dòng the_answer.get(), tôi sẽ không nhận được bất cứ điều gì in. Đây có phải là hành vi dự định của std :: async function hay tôi đang làm điều gì sai ở đây? Điều này là do tôi nghĩ the_answer.get() được sử dụng để chờ cho hàm hoàn thành và để lấy kết quả.

Cảm ơn.

+1

tôi đoán là hành vi mà bạn đang nhìn thấy là hành vi cho phép theo tiêu chuẩn, mặc dù nó rất phụ tối ưu. Bây giờ, toàn bộ điều này cũng bị hỏng vì bạn không có 'return' ở cuối' calculate_the_answer_to_LtUaE'. – Omnifarious

Trả lời

5

Nếu bạn đọc phần của nội dung bạn đã liên kết về 'các chính sách khởi chạy', bạn sẽ thấy rằng tôi chính xác trong nhận xét của tôi. Hành vi bạn thấy là hoàn toàn được phép.

Bạn có thể buộc những gì bạn muốn sử dụng chính sách ra mắt như vậy:

std::future<int> the_answer=std::async(std::launch::async,calculate_the_answer_to_LtUaE); 
4

"Chính sách khởi chạy mặc định cho std :: async là std :: launch :: any, có nghĩa là triển khai sẽ được chọn cho bạn."

Bạn cần std::launch::async, về cơ bản:

std::future<int> the_answer=std::async(std::launch::async, calculate_the_answer_to_LtUaE); 
//          ^^^^^^^^^^^^^^^^^^ 

Để đảm bảo rằng cuộc gọi async được đặt trong một chủ đề mới. Nếu không, nó có thể chỉ cần gọi tắt chức năng tính toán cho đến khi the_answer.get() và gọi nó trong chuỗi hiện tại.

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