Với mã nguồn saustd :: kỳ hạn và ngoại lệ
#include <thread>
#include <future>
#include <iostream>
#include <string>
#include <chrono>
int main() {
auto task = std::async(std::launch::async, [] {
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
throw std::runtime_error("error");
});
try {
while (task.wait_for(std::chrono::seconds(0)) !=std::future_status::ready)
{
std::cout << "Not ready: " << std::endl;
}
task.get();
}
catch (const std::exception& e)
{
std::cout << "Valid: " << task.valid() << std::endl;
}
}
tôi mong đợi, rằng chương trình sẽ đáp ứng với Valid: 0
. Sử dụng g ++ 6.2.0 đây là trường hợp. Tuy nhiên, sử dụng MS VS2015 Phiên bản 14.0.25431.01 Cập nhật 3 câu trả lời là Valid: 1
. Trạng thái của tương lai không phải là không hợp lệ, sau khi ngoại lệ được truyền cho chủ đề chính. Đây có phải là một lỗi hoặc tôi đang chạy vào hành vi không xác định ở đây?
Có cách giải quyết khác không? Khi tôi loại bỏ câu lệnh wait_for nó hoạt động như mong đợi, nhưng trong mã sản xuất của tôi, tôi cần một luồng chương trình tương tự với nguồn mẫu. – IcePic
@IcePic có thể sử dụng 'concurrency :: task' để thay thế. theo VC++, 'std :: async' là một trình bao bọc mỏng xung quanh các tác vụ. –