2014-09-10 18 views
15

Tôi đang gặp phải điều gì đó rất lạ khi sử dụng các tác vụ đóng gói. Khi đọc ~packaged_task Tôi nhận được ấn tượng rằng nếu std::packaged_task bị hủy trước khi nó được thực hiện, lời hứa sẽ bị hỏng và nỗ lực lấy kết quả từ tương lai sẽ ném std::future_error.std :: packaged_task không phá vỡ lời hứa về sự hủy diệt?

Tuy nhiên, trên Visual Studio 2013, điều này có vẻ không đúng. Hãy mã sau đây:

#include <iostream> 
#include <future> 
#include <functional> 

int main() { 
    std::future<int> f; 
    { 
     std::packaged_task<int()> task([](){return 3; }); 
     f = task.get_future(); 
    } 
    std::cout<<f.get()<<std::endl; 
    return 0; 
} 

Tôi đang chờ đợi để có được một std::future_error trên f.get() nhưng thay vào đó nó chặn, chờ đợi cho các nhiệm vụ đóng gói được thực hiện.

Đang cố gắng biên dịch khác: http://ideone.com/Wt0WOc không thực sự ném một std::future_error("Broken promise") ...

Am Tôi nhìn thấy một lỗi trong Visual Studio 2013 hoặc tôi đã bị mất cái gì?

Trả lời

10

Bạn đang chính xác. ~packaged_task() từ bỏ trạng thái được chia sẻ (§30.6.9.1 [futures.task.members]/p9), có nghĩa là nếu trạng thái chia sẻ không sẵn sàng, lưu trữ một đối tượng ngoại lệ loại future_error với điều kiện lỗi là broken_promise, sau đó tạo trạng thái chia sẻ sẳn sàng; và sau đó phát hành trạng thái chia sẻ (§30.6.4 [futures.state]/p7).

Đây là known bug rằng will be fixed trong phiên bản tiếp theo của Visual Studio, có khả năng sẽ xuất hiện vào năm 2015. Nó cũng được khắc phục trong CTP, nhưng đó là một ý tưởng khá xấu khi sử dụng mã sản xuất. .

+0

Vì vậy, tôi đã đọc những liên kết này một cách chính xác, điều này sẽ không được sửa trong VS 2013? –

+0

@EmilyL. Tôi rất muốn nói. Theo [Q5 trong phần Câu hỏi thường gặp của trang này] (http://blogs.msdn.com/b/vcblog/archive/2013/06/28/c-11-14-stl-features-fixes-and-breaking -changes-in-vs-2013.aspx), họ chỉ sửa lại các bản sửa lỗi. –

+2

Tuyệt vời, hãng phim chúng tôi mua chỉ mới một tuổi và họ đã rời khỏi chúng tôi trong một nhúm. * thở dài * Cảm ơn bạn đã xác nhận. Chấp nhận câu trả lời này khi các liên kết đưa ra xác nhận cuối cùng về những nghi ngờ của tôi. –

7

Tôi nghĩ rằng đó là lỗi, tiêu chuẩn cho biết ~packaged_task từ bỏ trạng thái được chia sẻ, có nghĩa là nếu chưa sẵn sàng, bạn nên lưu trữ một ngoại lệ broken_promise và làm cho trạng thái sẵn sàng, giống như bạn mong đợi.

tiết lộ đầy đủ: test ideone.com của bạn sử dụng GCC và tôi thực hiện GCC của <future> vì vậy tôi có thể bị sai lệch khi tôi nói hành vi của nó là đúng ... nhưng tôi nghĩ rằng nó vẫn còn đúng ;-)

+0

Hoàn toàn đồng ý. Một 'tương lai 'bị bỏ rơi (tức là giá trị trả lại trong trường hợp này) là * tình huống * cho' broken_promise'. – starturtle

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