Остановка многопоточного серверного цикла с помощью Boost :: Asio - PullRequest
5 голосов
/ 16 января 2011

Я разрабатываю крошечный серверный цикл для более крупного программного обеспечения, но он не работает так, как я хочу.

Когда пользователь вводит ".quit", я хочу, чтобы программное обеспечение прекратило этот потоксерверный цикл:

try {

while (true) {
      acceptor.accept(socket);
      const size_t buffersize = 1024;
      char data[buffersize+1] = {0};
      data[socket.read_some(boost::asio::buffer(data,buffersize))] = '\0'; // Write data & place terminator
      boost::thread asyncWriting(boost::bind( &myClass::writeToFile, this ));
      socket.close();
}

} catch(const boost::system::system_error& e) {
    cout << "Boost System Error: " << e.what() << endl;
}

Я запускаю поток следующим образом:

serverThread = boost::shared_ptr<boost::thread>( new boost::thread(boost::bind( &myClass::startServer, this )) );

Но у меня возникают проблемы с остановкой "сервера".Независимо от того, прерываю ли я поток, закрываю сокет и / или получатель или просто ломаю программу, Boost выдает ошибку:

 Bad file descriptor

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

Можете ли вы помочь мне, как отключить это clean ?

1 Ответ

2 голосов
/ 16 января 2011

Обычно серверы пишутся с использованием асинхронных методов

  • async_accept
  • async_read
  • async_write

inВ этом случае предлагаемый метод отключения всех ожидающих асинхронных операций заключается в остановке цикла обработки событий io_service.Обратите внимание, что вам следует обратить особое внимание на документацию ~io_service

Описанная выше последовательность уничтожения позволяет программам упростить управление своими ресурсами с помощью shared_ptr <>.Если время жизни объекта связано с временем жизни соединения (или некоторой другой последовательностью асинхронных операций), shared_ptr объекта будет привязан к обработчикам для всех асинхронных операций, связанных с ним.

Для меня это не очевидно из-за ограниченного кода, который вы разместили, где ваша проблема, я бы предложил опубликовать больше кода или запустить то, что у вас под valgrind , так как это, скорее всего, выявит некоторые проблемы.

Я ответил на похожий вопрос несколько дней назад, который может оказаться полезным

...