2012-02-11 37 views
9

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?

+2

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

Trả lời

5

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ông
  • async: bạn rõ ràng yêu cầu cho một thread để được sinh ra
  • deferred: 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ác
  • async: sẽ được thực hiện trên một thread
  • deferred: 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ụ.

+1

"đồng bộ hóa" là thực sự 'std :: launch :: deferred' – Cubbi

+0

@Cubbi: cảm ơn vì đã chỉ ra, tôi nên có kiểm tra chéo với tiêu chuẩn. –

+0

"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. –

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