2013-06-02 33 views
19

Một trong những đề xuất cho C++ 14 là Resumable Functions cung cấp cho C++ những gì có sẵn trong C# ngày hôm nay với các cơ chế async/await. Ý tưởng cơ bản là một hàm có thể bị tạm dừng trong khi chờ đợi thao tác không đồng bộ hoàn tất. Khi hoạt động không đồng bộ hoàn thành chức năng có thể được tiếp tục khi nó được tạm dừng. Điều này được thực hiện theo cách không bị chặn sao cho luồng mà từ đó chức năng có thể tiếp tục được gọi sẽ không bị chặn.Trong những ngữ cảnh nào sẽ tiếp tục các chức năng thực thi trong C++ 14?

Không rõ ràng đối với tôi trong đó ngữ cảnh (chuỗi) chức năng sẽ được tiếp tục. Nó sẽ được nối lại bởi chuỗi mà từ đó hàm bị tạm dừng (đây là cách nó được thực hiện trong C# như tôi hiểu nó) hay nó sử dụng một luồng khác?

Nếu nó được nối lại theo chuỗi mà từ đó nó đã bị tạm dừng, luồng có phải được đặt ở một số trạng thái đặc biệt hoặc trình lên lịch sẽ xử lý điều này không?

+1

Tôi không biết bạn đã hỏi gì, nhưng nếu chức năng tiếp tục không bị chặn, thì có lẽ nó trả về một loại 'std :: optional' và người nhận phải kiểm tra xem kết quả có sẵn hay không không phải. Có vẻ như bạn đã có thể mã hóa như vậy với cơ chế hiện tại của 'std :: future' ...? –

+0

Tôi không nghĩ rằng đề xuất đã được chấp nhận. – chris

+0

@Karrek SB: Đề xuất được liên kết nếu bạn muốn đọc về nó. Bạn đúng rằng tương lai có thể được sử dụng để đạt được điều tương tự (thường là với tương lai cũng được đề xuất. Sau đó). Đề xuất chi tiết cách nó khác với việc sử dụng tương lai trực tiếp và tại sao điều này sẽ là một ý tưởng hay. –

Trả lời

4

Để trích dẫn từ N3564:

Sau khi đình chỉ, một chức năng resumable có thể được nối lại bởi logic lịch trình của thời gian chạy và cuối cùng sẽ hoàn logic của nó, lúc này nó thực thi một câu lệnh return (rõ ràng hoặc ngầm) và đặt giá trị kết quả của hàm trong trình giữ chỗ. Do đó, cần lưu ý rằng có sự bất đối xứng giữa hành vi quan sát của hàm từ bên ngoài (người gọi) và bên trong: quan điểm bên ngoài là hàm trả về giá trị tương lai kiểu tại điểm treo đầu tiên, trong khi bên trong quan điểm là hàm trả về một giá trị kiểu T thông qua một câu lệnh trả về, các hàm trả về tương lai/shared_future hoạt động hơi khác một chút.

Chức năng có thể tiếp tục có thể tiếp tục thực hiện trên một chuỗi khác sau khi tiếp tục sau khi tạm ngưng thực thi.

này về cơ bản có nghĩa là

  • Khi lần đầu tiên được gọi là, một chức năng resumable thực hiện trong bối cảnh thread gọi của nó.
  • Sau mỗi điểm tạm dừng, việc triển khai có thể tự do lựa chọn chuỗi nào để tiếp tục thực hiện chức năng có thể tiếp tục
  • Từ quan điểm của mã gọi, chức năng có thể tiếp tục hoạt động như chức năng không đồng bộ.) hành vi được thực hiện một cách đáng tin cậy vào thời điểm hàm trả về, nhưng kết quả cuối cùng có thể chưa được trả về (số future<T> trả về không phải ở trạng thái sẵn sàng).
  • Là một lập trình viên, bạn không phải nhảy qua các vòng để có được chức năng tiếp tục để tiếp tục.
+0

Xem một số trong hành động ở đây: http://blogs.msdn.com/b/vcblog/archive/2013/12 /20/asynchronous-programming-in-c-using-resumable-functions-and-await.aspx –

+0

và hơn thế nữa tại đây http://blogs.msdn.com/b/vcblog/archive/2014/11/12/resumable- function-in-c.aspx –

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