std :: async có quá tải phải mất tiêu chuẩn std :: launch làm đối số đầu tiên. Khi nào tôi nên sử dụng tình trạng quá tải này? các chính sách khác nhau có sẵn là gì? (Tôi nghĩ rằng đồng bộ và không đồng bộ là hai tùy chọn). Khi nào tôi nên sử dụng chính sách đồng bộ hóa? Làm thế nào là khác nhau từ trực tiếp chạy nó?Khi nào tôi nên sử dụng lệnh std :: async with sync as policy?
Trả lời
Tóm tắt từ the very helpful article that Jagannath linked và nhận xét về cách sử dụng có thể.
Có 3 chính sách ra mắt:
any
: thư viện chọn xem có nên đẻ trứng một sợi một hay khôngasync
: bạn rõ ràng yêu cầu cho một thread để được sinh radeferred
: bạn một cách rõ ràng yêu cầu một sợi không phải để được sinh ra
Do đó,Chính sáchlà cách để có được đánh giá xác định lười biếng (còn gọi là gọi theo nhu cầu). Ví dụ, giả sử rằng bạn có:
void MyClass::lazy(std::future<int> const& f) {
if (this->notReady()) { return; }
if (this->stillNotReady()) { return; }
if (this->value() == 42) { return; }
this->go(f.get());
}
Bây giờ, nếu tính toán giá trị của số nguyên này là dài (ví dụ, nó có thể gọi một khứ hồi mạng), sau đó nó kinda lãng phí để tính toán nó trong tất cả các những trường hợp không thực sự yêu cầu nó ... và bây giờ chúng tôi đã có công cụ để làm như vậy!
void func(MyClass& mc) {
std::future<int> f = std::async(std::launch::deferred, []() {
return stoi(memcached.get("KEY"));
});
mc.lazy(f);
}
Lưu ý rằng đây là tinh tế khác nhau từ việc sử dụng một std::function<int()>
(và đóng cửa), vì việc tính toán được thực hiện một lần và cho tất cả, đảm bảo rằng cuộc gọi tiếp theo để có được luôn luôn trả lại kết quả tương tự.
Sự khác biệt với các chính sách khác cũng có thể được biểu thị nếu hoạt động được thực hiện khi bạn không cần giá trị.
any
: có thể được thực hiện trên một thread (chủ động) hoặc không được thực hiện ở tất cả cácasync
: sẽ được thực hiện trên một threaddeferred
: sẽ không được thực hiện
Do đó, deferred
cho phép bạn kiểm soát tốt hơn, điều quan trọng nếu cuộc gọi có tác dụng phụ.
"đồng bộ hóa" là thực sự 'std :: launch :: deferred' – Cubbi
@Cubbi: cảm ơn vì đã chỉ ra, tôi nên có kiểm tra chéo với tiêu chuẩn. –
"các cuộc gọi tiếp theo tới' get() '" sẽ gọi hành vi không xác định, vì 'get()' làm mất hiệu lực 'tương lai'. Bạn sẽ cần một 'shared_future' để tránh sự vô hiệu. –
- 1. hành vi của std :: async với std :: launch :: async policy
- 2. Tại sao tôi nên sử dụng std :: async?
- 3. Khi nào tôi nên sử dụng async/await và khi nào thì không?
- 4. Grand Central Dispatch async vs sync
- 5. Khi nào nên sử dụng async false và async true trong chức năng ajax trong jquery
- 6. Khi nào tôi nên sử dụng adorners?
- 7. Async/Await with WinForms ProgressBar
- 8. Khi nào tôi nên sử dụng SynchronousQueue
- 9. Khi nào tôi nên sử dụng GC.SuppressFinalize()?
- 10. Khi nào tôi nên sử dụng ConcurrentSkipListMap?
- 11. Khi nào tôi nên sử dụng AQL?
- 12. Khi nào tôi nên sử dụng require() và khi nào nên sử dụng define()?
- 13. Khi nào tôi không nên sử dụng dấu chấm phẩy?
- 14. Khi nào nên sử dụng() so với 'as' để thay đổi loại?
- 15. Tôi có nên kiểm tra tăng :: shared_ptr hoặc std :: shared_ptr trước khi tôi sử dụng không?
- 16. Tôi không thể sử dụng std :: vector của auto_ptr - tôi nên sử dụng shared_ptr?
- 17. C# Khi nào tôi nên sử dụng Danh sách và khi nào tôi nên sử dụng danh sách array?
- 18. Khi nào tôi nên sử dụng stdClass và khi nào tôi nên sử dụng một mảng trong mã php oo?
- 19. Trong Jira Agile khi nào tôi nên sử dụng "Story" và khi nào tôi nên sử dụng "Cải tiến"
- 20. Khi nào tôi nên sử dụng Gói-Nhập khẩu và khi nào tôi nên sử dụng Yêu cầu-Gói?
- 21. Khi nào bạn nên sử dụng trình tải tập lệnh?
- 22. Khi nào tôi nên sử dụng git add?
- 23. Khi nào tôi nên sử dụng setUpClass và khi __init__?
- 24. Khi nào tôi nên sử dụng remove_reference và add_reference?
- 25. Khi nào tôi nên sử dụng AUTOLOAD của Perl?
- 26. Khi nào tôi nên sử dụng Bảng chỉ mục của Oracle? Hoặc, khi tôi không nên?
- 27. Khi nào bạn nên sử dụng Bộ điều khiển Async trong ASP.NET MVC?
- 28. Khi nào nên sử dụng hệ thống() và khi nào nên sử dụng execv *()?
- 29. Tại sao tôi không thể xóa chuỗi khỏi std :: set with std :: remove_if?
- 30. Xử lý lệnh std :: string/std :: biến thành viên vectơ khi sử dụng boost :: singleton_pool
http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.html ---> Điều này có thể hữu ích – Jagannath