Có cách nào để kiểm tra xem một tương lai có sắp xảy ra trước khi gọi không?
Câu hỏi của bạn là tương đương với:
Có cách nào để kiểm tra xem một hàm sẽ ném trước khi gọi nó?
Câu trả lời cho cả hai câu hỏi, nói chung là không.
xem xét:
int func_that_might_throw()
{
if (rand() % 2)
throw 1;
return 0;
}
std::future<int> f = std::async(&func_that_might_throw);
int result = f.get();
Cuộc gọi async
có thể trở lại một chức năng thu nhập hoãn lại, trong trường hợp chức năng thậm chí không chạy cho đến khi bạn gọi get()
, vì vậy nói chung không có cách nào để biết trước liệu kết quả sẽ là một giá trị hoặc một ngoại lệ. (Bạn có thể phát hiện hàm bị trì hoãn bằng cách gọi f.wait_for(std::chrono::seconds(0))
, nhưng async
có thể không trả về hàm bị trì hoãn và trong trường hợp đó hàm vẫn có thể chạy không đồng bộ khi bạn thử kiểm tra xem nó có ngoại lệ được lưu trữ hay không, vì vậy bạn phải kiểm tra nếu nó đã sẵn sàng và có ngoại lệ được lưu trữ, do đó việc kiểm tra chỉ trở nên rất lộn xộn.)
Một trạng thái được chia sẻ hợp lệ sẵn sàng có kết quả là giá trị hoặc ngoại lệ. Cả hai đều là kết quả hợp lệ.Nếu bạn không muốn xử lý các ngoại lệ thì bạn nên đảm bảo một ngoại lệ không được đặt trong trạng thái được chia sẻ ở địa điểm đầu tiên.
Nguồn
2013-03-18 11:27:08
Một 'std :: future' có thể được xem như một người quan sát đến trạng thái của' std :: promise'. Nếu lời hứa đã biến mất, tương lai sẽ lơ lửng. Nó không phải UB như sehe nói, nhưng bạn nhận được một ngoại lệ 'std :: broken_promise', bởi vì lời hứa không bao giờ có thể được lấp đầy. – Xeo
hợp lệ sẽ trả về false khi bạn đã gọi 'get' hoặc' share' một lần. – inf
[tương lai :: hợp lệ] (http://en.cppreference.com/w/cpp/thread/future/valid) nói 'Kiểm tra xem tương lai có đề cập đến trạng thái chia sẻ' hay không. Nếu lời hứa đã biến mất và giá trị chưa bao giờ được đặt không có nghĩa là không có trạng thái chia sẻ? – David