2014-11-30 7 views
2

The documentation for boost::asio::ssl::stream состояния следующая относительно безопасность резьбы:Выполнение асинхронных операций в пределах одной и те же цепей

Потокобезопасности

  • отчетливых объектов: Безопасная.

  • Общие объекты: Небезопасные. Приложение также должно гарантировать, что все асинхронные операции выполняются в пределах одной и той же неявной или явной строки.

Если я сравнить это с documentation for the boost::asio::ip::tcp::socket type, тем утверждением о прядях не входят.

Вопросы

Если доступ к объекту потока контролируется с помощью взаимной блокировки, убедившись, что только один поток работает на потоке Ssl в данный момент времени, что потребность в использовании неявного/явного прядь ?

Кроме того, что означает «асинхронные операции» в этом контексте? Является ли документ ссылкой на вызовы, например, boost :: asio :: async_read/boost :: asio :: async_read, или на обратные вызовы обработчика, которые я передаю этим операциям?

ответ

1

Если доступ к объекту потока управляется мьютексом, убедитесь, что только один поток работает в потоке ssl в заданное время, в чем же заключается необходимость использования неявной/явной строки?

В этом нет необходимости. Мьютекс делает операции сериализуются как на «логической цепочке». пряди ASIO в являются лишь механизмом для достижения такой сериализации без явного кода синхронизации в случае, если у Вас есть больше чем один сервис где выполняется io_service

Кроме того, что это «асинхронные операции» означает в данном контексте? Является ли документ ссылкой на вызовы, например, boost :: asio :: async_read/boost :: asio :: async_read, или на обратные вызовы обработчика, которые я передаю этим операциям?

Boost ссылается на реализацию этих функций-членов/свободных функций, поскольку они работают с объектами службы, которые не являются потокобезопасными. Обработчики завершения - ваша собственная забота: если вы сделаете их потокобезопасными, тогда больше нет необходимости в цепочках. Имейте в виду, что вы не можете начать асинхронные операции непосредственно из таких «десериализуются» обработчиков завершения, что приводит к коду, как:

void completionhandler(error_code const& ec) { 
    if (!ec) { 
     io_service_.post([] { boost::asio::async_...(...); }); 
     // or: 
     strand_.post([] { boost::asio::async_...(...); }); 
    } 
} 

Это использует тот факт, что strand и io_serviceобъекты являются поточно.

+0

Если нет необходимости, можете ли вы понять, почему в документе указано использование нитей? Другие части документов просто указывают, что общие объекты небезопасны, и все. Вы говорите, что запуск асинхронных операций с обработчиками завершения невозможен. Почему это? Я попробовал, и у меня не было никаких проблем. – Nitramk

+0

Нет необходимости в документации, поскольку это всего лишь стандартная спецификация C++. Если вы синхронизируете доступ, вам не нужна гонка данных, поэтому вы вообще не столкнетесь с проблемой безопасности потоков. Тот факт, что документация иногда намекает на существование «прядей» для этой цели, - это просто дружеский жест для пользователей библиотеки. Это может быть довольно сложно узнать о нитях и о том, для чего они полезны, без таких намеков. Фактически, человек мог бы задаться вопросом, как на земле они могут с пользой работать с boost asio в многопоточной среде, за исключением того, что добавляются тонны блокировки везде. – sehe

+0

Boost Asio ориентирован на асинхронные реакторные конструкции, где количество операций не " t шкала с потоками; это связано с тем, что для этого требуются высокопроизводительные серверы (потоки и блокировка просто снижают производительность). Таким образом, люди, читающие документацию, с удовольствием узнают, что Boost Asio может выполнить необходимую синхронизацию, используя понятие нити – sehe

Смежные вопросы