2011-07-29 27 views
8

Làm cách nào để thực hiện thao tác async_ * trên ổ cắm qua sợi? Tôi đã xem xét Timer.5 (ví dụ Boost/Asio), nhưng chúng chỉ hiển thị cách gọi trình xử lý của người dùng. Khi tôi async_write vào ổ cắm trong dữ liệu ứng dụng đa luồng có thể được ghi bị hỏng. Và strand đảm bảo rằng không có trình xử lý nào trong số đó sẽ thực thi đồng thời.boost :: asio socket async_ * strand

+1

Bạn gặp sự cố gì đặc biệt? Thực hiện các hoạt động không đồng bộ không khác biệt đáng kể khi sử dụng 'chuỗi' so với _not_ bằng cách sử dụng' chuỗi'. Chỉ cần quấn xử lý của bạn trong sợi. – Chad

+0

Câu hỏi này không có ý nghĩa như hiện đang diễn đạt, vui lòng chỉnh sửa và thêm một số sự rõ ràng. –

+0

Nó có ý nghĩa hoàn hảo với tôi. Im có cùng một vấn đề. Nhiều chủ đề đang cố gắng sử dụng một kết nối duy nhất đọc/ghi yêu cầu phản ứng và có tất cả điều sai lầm. Những gì tôi đang cố gắng đạt được là một yêu cầu đọc theo yêu cầu/làm bất cứ điều gì cần thiết để xử lý (thậm chí một yêu cầu/phản hồi khác với dịch vụ khác) và sau đó trả lời phản hồi cho người yêu cầu ban đầu. – Roskoto

Trả lời

4

Từ Boost.Asio tài liệu:

Các io_service :: lớp sợi cung cấp khả năng gửi và gửi xử lý với sự đảm bảo rằng không ai trong số những bộ xử lý sẽ thực hiện đồng thời.

a good example của strand sử dụng trong Boost.Asio ví dụ.

strand đảm bảo rằng quá trình xử lý của bạn sẽ được đồng bộ hóa. Điều đó có nghĩa là strand hữu ích nếu io_service của bạn được thực thi từ nhiều luồng. Nó không liên quan đến cách bạn lên lịch công việc của mình (trình xử lý).

strand không thể giúp bạn thực hiện đồng thời nhiều lệnh đọc hoặc ghi đồng thời vì thực thi đọc/ghi nội bộ không thể thực hiện đồng thời, vì vậy chỉ nên có một hoạt động đọc hoặc ghi async op.

Đối với reads bạn chỉ cần gọi async_read để bắt đầu chuỗi đọc và gọi lại lần nữa từ trình xử lý đọc của bạn sau khi sử dụng dữ liệu đã nhận. Điều tương tự bạn làm trong môi trường luồng đơn.

Đối writes nếu có là nhà sản xuất đồng thời (nếu có nhiều chủ đề cung cấp dữ liệu để được ghi vào ổ cắm), bạn cần một hàng đợi đồng thời (ví dụ boost circular buffer, hãy tìm "Bounded đệm Ví dụ"). Hàm write của bạn lấy dữ liệu từ bộ đệm này và async ghi nó vào socket. Trình xử lý ghi của bạn gọi hàm viết của bạn.

3

Khi tôi async_write() vào ổ cắm trong dữ liệu ứng dụng đa luồng có thể bị hỏng. Và Strand đảm bảo rằng không ai trong số những người xử lý này sẽ thực thi đồng thời.

Nếu có nhiều chủ đề cần ghi dữ liệu trên ổ cắm, bạn sẽ phải đảm bảo thứ tự của dữ liệu. Điều này rõ ràng trong async_write()documentation. chương trình

phải đảm bảo rằng các dòng thực hiện không khác ghi hoạt động (chẳng hạn như async_write, async_write_some chức năng của dòng, hoặc bất kỳ hoạt động sáng tác khác mà thực hiện viết) cho đến khi hoạt động này hoàn tất.

Tôi đề nghị duy trì một hàng đợi thư, rất giống với this questionanswer của tôi.

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