Có vẻ như rằng trừ khi bạn gọi std::async
một std::future
sẽ không bao giờ được thiết lập để bất cứ tiểu bang khác hơn future_status::deferred
trừ khi bạn gọi get
hoặc wait
về tương lai. wait_for
& wait_until
sẽ tiếp tục không chặn và trả về future_status::deferred
ngay cả khi tác vụ đã chạy và lưu kết quả.std :: tương lai vẫn chậm khi sử dụng std :: packaged_task (VS11)
Dưới đây là một ví dụ:
#include <future>
void main()
{
auto func = []() { return 5; };
auto asyncFuture = std::async(std::launch::async, func);
auto status = asyncFuture.wait_for(std::chrono::seconds(0)); // timeout (1)
auto deferredFuture = std::async(std::launch::deferred, func);
status = deferredFuture.wait_for(std::chrono::seconds(0)); // deferred (2)
std::packaged_task<int()> task(func);
auto packagedTaskFuture = task.get_future();
status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // deferred (2)
task();
status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // deferred (2)
packagedTaskFuture.wait();
status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // ready (0)
}
Tôi không có tiêu chuẩn C++ 11 hiện tại, nhưng dự thảo tiêu chuẩn trong 30.6.9 nói rằng khi một packaged_task
đang chạy nó nên lưu trữ kết quả trong trạng thái chia sẻ của tương lai. Nó không phải là rất rõ ràng cho dù đó bao gồm thiết lập mong đợi wait_until
/wait_for
hành vi hay không.
trước đây Có vấn đề với hành vi VS11 trong lĩnh vực này liên quan đến async
cuộc gọi: http://social.msdn.microsoft.com/Forums/hu/parallelcppnative/thread/4394f2c1-0404-40df-869b-f4fc36fc035c
Ngoài ra nó có vẻ như trình biên dịch khác có vấn đề trong lĩnh vực này: C++ 11 future_status::deferred not working
Bất cứ ai cũng có thể biết các tiêu chuẩn tốt hơn: Đây có phải là hành vi mong đợi hoặc có vấn đề với việc triển khai trong VS11 không?
Cập nhật: Tôi bằng cách nào đó bỏ lỡ báo cáo cho việc này: http://connect.microsoft.com/VisualStudio/feedback/details/761829/c-11-unexpected-behavior-for-std-future-wait-for-and-std-packaged-task
Tình trạng trì hoãn tương tự có được là không may bằng cách sử dụng VS 11 - Cập nhật 1, khi tương lai có được từ lời hứa (nó hoạt động với async). Vấn đề đã được báo cáo cho họ một thời gian trước nhưng vẫn không hoạt động. Nó thực tế đánh bại mục đích của việc sử dụng std :: tương lai trong nhiều trường hợp. Làm việc với tăng 1,51 ít nhất. – Ghita