- nó được gọi là async, nhưng nó có một thực sự "hành vi tuần tự",
Không, nếu bạn sử dụng các chính sách std::launch::async
sau đó nó chạy không đồng bộ trong một chủ đề mới. Nếu bạn không chỉ định chính sách, thì có thể sẽ chạy trong một chuỗi mới.
về cơ bản trong hàng mà bạn gọi tương lai được liên kết với hàm không đồng bộ của bạn foo, chương trình sẽ chặn cho đến khi quá trình thực thi hoàn tất.
Nó chỉ chặn nếu foo chưa hoàn thành, nhưng nếu nó chạy không đồng bộ (ví dụ: vì bạn sử dụng chính sách std::launch::async
) có thể đã hoàn tất trước khi bạn cần.
- nó phụ thuộc vào cùng một thư viện chính xác bên ngoài như những người khác, và tốt hơn, giải pháp non-blocking, có nghĩa pthread, nếu bạn muốn sử dụng std :: async bạn cần pthread.
sai, nó không nhất thiết phải được thực hiện sử dụng pthreads (và trên Windows nó không phải là, nó sử dụng các tính năng ConcRT.)
vào thời điểm này nó là điều tự nhiên đối với tôi hỏi tại sao chọn std :: async hơn cả một bộ đơn giản của các functors?
Bởi vì nó đảm bảo an toàn luồng và truyền bá ngoại lệ trên các chuỗi. Bạn có thể làm điều đó với một bộ đơn giản của các functors?
Đó là một giải pháp thậm chí không quy mô chút nào, càng có nhiều tương lai bạn gọi, chương trình của bạn càng ít đáp ứng.
Không nhất thiết. Nếu bạn không chỉ định chính sách khởi chạy thì việc triển khai thông minh có thể quyết định có nên bắt đầu một chuỗi mới hay trả về một hàm bị trì hoãn hoặc trả về một cái gì đó quyết định sau này khi có thêm tài nguyên. Bây giờ, đúng là với việc thực hiện GCC, nếu bạn không cung cấp chính sách khởi chạy thì với bản phát hành hiện tại, nó sẽ không bao giờ chạy trong một chủ đề mới (có một số bugzilla report cho điều đó) nhưng đó là tài sản của việc triển khai đó, chứ không phải là trong tổng số std::async
nói chung. Bạn không nên nhầm lẫn các đặc điểm kỹ thuật trong tiêu chuẩn với một thực hiện cụ thể. Việc đọc triển khai thực hiện một thư viện chuẩn là một cách không tốt để tìm hiểu về C++ 11.
Bạn có thể hiển thị ví dụ được cấp để được thực thi theo cách không đồng bộ, không chặn, không?
này không nên chặn:
auto fut = std::async(std::launch::async, doSomethingThatTakesTenSeconds);
auto result1 = doSomethingThatTakesTwentySeconds();
auto result2 = fut.get();
Bằng cách xác định các chính sách ra mắt bạn buộc thực hiện không đồng bộ, và nếu bạn làm các công việc khác trong khi nó đang thực hiện thì kết quả sẽ sẵn sàng khi bạn cần nó.
@rsaxvc nơi bạn gọi hàm async, ví dụ 'future.get()' – user2485710
Giả định của bạn sai. async() được thiết kế để cung cấp một điểm đồng bộ hóa để bạn có thể nhận được kết quả của hàm đang được đánh giá không đồng bộ. – DanielKO
Ý tưởng hiện tại của C++ về "async" không thực sự mang lại bất kỳ điều gì đáng kể (ngoài tính di động) cho bảng so với các tùy chọn khác. Một khi nó được hỗ trợ tiếp tục hoàn thành (đó là một phần quan trọng của những gì hầu như mọi nền tảng khác gọi là "không đồng bộ"), tôi nghi ngờ bạn sẽ tìm thấy nhiều công dụng hơn cho nó. –