2009-04-04 25 views
34

Đang cố gắng tìm hiểu asio và tôi đang theo dõi các ví dụ từ trang web.io_service, tại sao và nó được sử dụng như thế nào?

Tại sao io_service lại cần thiết và nó thực hiện chính xác những gì? Tại sao tôi cần phải gửi nó đến hầu hết các chức năng khác trong khi thực hiện các hoạt động không đồng bộ, tại sao nó không thể "tự tạo" sau "ràng buộc" đầu tiên.

Trả lời

46

Asio's io_service là người điều hành để hoạt động trên các chức năng không đồng bộ. Khi một hoạt động async đã sẵn sàng, nó sử dụng một trong các chủ đề đang chạy của io_service để gọi lại cho bạn. Nếu không có chủ đề như vậy tồn tại nó sử dụng thread nội bộ riêng của nó để gọi cho bạn.

Hãy coi đó là hàng đợi chứa các thao tác. Nó đảm bảo cho bạn rằng các hoạt động đó, khi chạy, sẽ chỉ làm như vậy trên các luồng được gọi là phương thức run() hoặc run_once() của chúng tôi hoặc khi xử lý các socket và IO không đồng bộ, luồng nội bộ của nó.

Lý do bạn phải chuyển nó cho mọi người về cơ bản là ai đó phải đợi các hoạt động không đồng bộ sẵn sàng và như được nêu trong tài liệu riêng của mình io_service là liên kết của ASIO với dịch vụ I/O của Hệ điều hành để nó tóm tắt bộ thông báo không đồng bộ của riêng nền tảng, chẳng hạn như kqueue, /dev/pool/, epoll và các phương pháp để hoạt động trên các thiết bị đó, chẳng hạn như select().

Chủ yếu tôi kết thúc bằng cách sử dụng io_service để gọi lại từ một số phần của hệ thống và đảm bảo chúng hoạt động trên cùng một chuỗi, loại bỏ nhu cầu khóa rõ ràng, vì các thao tác được sắp xếp theo thứ tự. Nó là một thành ngữ rất mạnh mẽ cho các ứng dụng không đồng bộ.

Bạn có thể xem core documentation để có cảm giác tốt hơn về lý do tại sao io_service là cần thiết và nó hoạt động như thế nào.

+2

'Chủ yếu tôi kết thúc bằng cách sử dụng io_service để gọi lại từ một số phần của hệ thống và đảm bảo chúng hoạt động trên cùng một chuỗi, (...)' Bạn có thể giải thích một chút về thành ngữ này không? – syntagma

+0

@ ΔλЛ bạn chỉ cần đăng các hoạt động lên io_service và khi thời gian đến để chạy, nó sẽ chọn đúng chuỗi và chạy nó, có thể được tuần tự hóa nếu bạn sử dụng một sợi để bọc các hoạt động. – Berkus

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