О boost :: asio :: io_service :: работать в многопоточности - PullRequest
1 голос
/ 27 января 2012

boost doc говорит, что io_service может произвольно распределять работу между потоками, означает ли это, что когда я использую TCP-сокет, я могу получить данные в беспорядке?Потому что мой обработчик приема может быть произвольно распределен по потокам.

1 Ответ

2 голосов
/ 30 января 2012

Когда вы планируете async_read или чтение с использованием повышения io_service, вы действуете на сокете. Либо через socket->read(...), либо read(socket ...). Если вы просматриваете документацию, есть несколько вариантов, которые принимают критерий для завершения чтения, количество байтов или условие соответствия. Используя это, вы можете иметь соединение, которое дает вам, скажем, 20 байтов данных, и вы читаете его в 10 байтах одному потоку, и пока этот поток обрабатывает данные, следующие 20 байтов переходят в другой поток. В некоторых случаях вы можете захотеть сделать это, но обычно вы хотите, чтобы каждый поток читал весь пакет.

Если вы хотите убедиться, что только один поток одновременно обрабатывает ваш io из сокета, вы можете обернуть обратные вызовы в strand. Вот довольно общий пример того, как это будет выглядеть.

boost::asio::async_read(socket, 
                        buffer(*responseBuffer), 
                        transfer_all(),
                        strand.wrap(boost::bind(&YourClass::handleRead, 
                                                 this, /*or use shared_from_this*/
                                                 placeholders::error)));
...