boost :: asio, потоки и синхронизация

Это в некоторой степени связано с этим вопросом , но я думаю, мне нужно знать немного больше. Я пытался понять, как это сделать в течение нескольких дней (работая над другими частями), но для меня настало время укусить пулю и стать многопоточным. Кроме того, мне нужно немного больше информации, чем связанный с вопросом

Во-первых, о многопоточности. Поскольку я тестировал свой код, я не беспокоился о многопоточности. Это' s просто консольное приложение, которое запускает соединение с тестовым сервером, а затем обрабатывается все остальное. Основной цикл следующий:

while(true)
{
    Root::instance().performIO(); // calls io_service::runOne();
}

Когда я пишу свое основное приложение, я предполагаю, что это решение будет неприемлемым (так как его придется вызывать в цикле сообщений, который, хотя и возможно, будет иметь проблемы, когда сообщение очереди блоков, ожидающих сообщения. Вы можете изменить это так, чтобы цикл сообщений не блокировался, но разве это не сильно сократит использование ЦП?)

Решение, кажется, состоит в том, чтобы бросить еще один нить на нем. В порядке прекрасно. Но потом я прочитал, что io_service :: run () возвращается, когда нет работы. Это что? Это когда нет данных или нет подключений? Если хотя бы одно соединение существует, остается ли оно в живых? Если так, то это ' Это не такая большая проблема, поскольку мне нужно только запустить новый поток при первом подключении, и я буду счастлив, если все это остановится, когда вообще ничего не происходит. Думаю, меня смущает определение «работы не надо делать».

Тогда мне нужно беспокоиться о синхронизации моего потока ускорения с моим основным потоком графического интерфейса. Итак, я предполагаю, что у меня следующие вопросы:

  1. Каков наилучший способ использования boost :: asio в клиентском приложении в отношении потоков и поддержания их активности?
  2. При записи в сокет из основного потока в поток ввода-вывода, достигается ли синхронизация с помощью boost :: asio :: post , чтобы вызов происходил позже в io_service?
  3. Когда данные получены, как люди возвращают данные в пользовательский интерфейс нить? Раньше, когда я использовал порты завершения, Я сделал специальное событие, которое могло отправить данные обратно в основной поток пользовательского интерфейса с помощью :: SendMessage. Это было не изящно, но сработало.

Я буду читать еще кое-что сегодня, но было бы здорово получить предупреждение от того, кто это уже сделал. Документация Boost :: asio невелика, и большая часть моей работы до сих пор была основана на небольшом количестве документации, некоторых методах проб / ошибок, некоторых примерах кода в Интернете.

11
задан Community 23 May 2017 в 12:18
поделиться