2012-10-08 30 views
9

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

+0

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

Trả lời

12

Đây là một vấn đề với VS2012. Nó không phải là vấn đề duy nhất hoặc --- thực hiện của họ trong thư viện chủ đề C++ 11 có một số lỗi. Tôi đã viết về một số on my blog.

+0

Cảm ơn! Tôi biết VS11 C++ 11 STL hỗ trợ không phải là tuyệt vời, nhưng tôi không nghĩ rằng nó muốn được hoàn toàn không sử dụng được. Bất kỳ ý kiến ​​về việc thực hiện của boost các tính năng này (rõ ràng là không đồng bộ hoặc những thứ mà họ chưa thực hiện)? –

+0

Việc triển khai tăng cường nói chung là âm thanh, đối với các tính năng được triển khai. Có một vài lỗi, nhưng chúng tôi đang làm việc trên chúng, và Vicente đang làm việc trên các tính năng C++ 11 còn thiếu. –

+0

@AnthonyWilliams Cảm ơn bạn đã hỗ trợ tăng cường. Đó là một cái gì đó có thể được dựa vào cho điều này – Ghita

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