Это в некоторой степени связано с этим вопросом , но я думаю, что мне нужно знать немного больше.Я пытался разобраться, как это сделать, в течение нескольких дней (работая над другими частями), но мне пришло время прикусить пулю и получить многопоточность.Кроме того, я хочу получить немного больше информации, чем связанный вопрос.
Во-первых, о многопоточности.Поскольку я тестировал свой код, я не беспокоился о многопоточности.Это просто консольное приложение, которое запускает соединение с тестовым сервером, и все остальное затем обрабатывается.Основной цикл таков:
while(true)
{
Root::instance().performIO(); // calls io_service::runOne();
}
Когда я пишу свое основное приложение, я предполагаю, что это решение не будет приемлемым (так как оно должно быть вызвано в цикле сообщений, который, по возможности,возникли бы проблемы, когда очередь сообщений блокировала бы ожидание сообщения. Вы могли бы изменить это так, чтобы цикл сообщений не блокировался, но разве это не приведет к тому, что загрузка ЦП будет стремительно падать?)
Решение, которое кажется, состоит в том, чтобы бросить другую нить в это.В порядке Хорошо.Но потом я прочитал, что io_service::run()
возвращается, когда нет работы.Что это такое?Это когда нет данных или нет соединений?Если хотя бы одно соединение существует, оно остается живым?Если это так, то это не такая большая проблема, поскольку мне нужно только запустить новый поток, когда установлено первое соединение, и я рад, если все это останавливается, когда ничего не происходит вообще.Я предполагаю, что меня смущает определение «ничего не делать».
Тогда мне нужно беспокоиться о синхронизации моего потока наддува с моим основным потоком GUI.Итак, я думаю, мои вопросы:
- Каков наилучший способ использования boost :: asio в клиентском приложении с точки зрения потоков и поддержания их в действии?
- Когдазапись в сокет из основного потока в поток ввода-вывода, выполняется ли синхронизация с использованием
boost::asio::post
, поэтому вызов в io_service происходит позже? - Когда данные принимаются, как люди возвращают данные обратнопоток пользовательского интерфейса?В прошлом, когда я использовал порты завершения, я делал специальное событие, которое могло отправить данные обратно в основной поток пользовательского интерфейса, используя :: SendMessage.Это не было элегантно, но это сработало.
Сегодня я прочитаю еще кое-что, но было бы здорово узнать мнение кого-то, кто уже сделал это.Документация Boost :: asio невелика, и большая часть моей работы до сих пор основывалась на небольшой части документации, некоторых пробах / ошибках, некоторых примерах кода в Интернете.