2012-11-04 48 views

Trả lời

9

io_service::run() sẽ chạy các hoạt động miễn là có các hoạt động không đồng bộ để thực hiện. Nếu, bất cứ lúc nào, không có hoạt động không đồng bộ nào đang chờ xử lý (hoặc các trình xử lý được gọi), cuộc gọi run() sẽ trở lại.

Tuy nhiên, có một số thiết kế muốn rằng cuộc gọi run() không thoát cho đến khi tất cả công việc được thực hiện VÀ io_service đã được hướng dẫn rõ ràng rằng bạn không thể thoát. Đó là những gì io_service::work được sử dụng cho. Bằng cách tạo đối tượng work (tôi thường làm điều đó trên heap và shared_ptr), io_service coi mình luôn có thứ gì đó đang chờ xử lý và do đó phương thức run() sẽ không trả lại. Một khi tôi muốn dịch vụ có thể thoát ra (thường là trong lúc tắt máy), tôi sẽ phá hủy đối tượng công việc.

+0

Tiêu hủy như sử dụng đặt lại()? – lucastamoios

+2

Thông thường, nếu tôi sử dụng shared_ptr để làm việc, thì có, tôi gọi 'reset()' trên shared_ptr. –

6

io_service::work là lớp cơ sở của tất cả các công trình đó có thể được đưa lên một thể hiện của io_service, ví dụ như khi bạn đang làm việc với một ổ cắm và bắt đầu một đọc không đồng bộ, thực sự bạn đang thêm một work đến io_service. Vì vậy, bạn thường không bao giờ sử dụng trực tiếp work, nhưng có một ngoại lệ cho điều này:

sẽ trả lại ngay sau khi không còn việc gì để làm, vì vậy hãy xem xét một ứng dụng có một số nhà sản xuất và chủ đề người tiêu dùng và gửi chúng đến chủ đề tiêu dùng với io_service::post, nhưng nếu tất cả công việc đã hoàn thành, thì io_service::run sẽ trả về và có thể chuỗi khách hàng của bạn sẽ bị dừng lại, vì vậy bạn cần một công việc tùy ý để giữ io_service bận rộn, trong trường hợp này bạn có thể sử dụng trực tiếp io_service::work.

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