Делегировать использование boost asio сокета TCP / IP - PullRequest
0 голосов
/ 13 февраля 2019

Я создал TCP-клиент с расширенным сокетом asio tcp, который выполняет асинхронное чтение:

class TCPClient {
 public:
  TCPClient(boost::asio::io_service& io_service)
    : socket_(io_service) {
    // Connect
    [...]
    // Asynchronous read
    socket_.async_read_some(boost::asio::buffer(buffer, buffer.size()),
                            boost::bind(&TCPClient::handlerRead,
                                        this,
                                        placeholders::error,
                                        placeholders::bytes_transferred));
  }
  ~TCPClient() {}

  void handlerRead(const boost::system::error_code& ec, uint32_t bytes) {
    if (!ec) {
      // process
      [...]
      socket_.async_read_some(
        boost::asio::buffer(buffer, buffer.size()),
        boost::bind(&TCPClient::handlerRead,
                    this,
                    placeholders::error,
                    placeholders::bytes_transferred));
  }

  int getSocketFd() {
    return socket_.native_handle();
  }

 private:
  boost::asio::tcp::socket socket_;
};

Это работает нормально.Но когда я помещаю это в поток:

boost::asio::io_service io_service;
auto client = new TCPClient(io_service);
std::thread{[&io_service](){ io_service.run(); }};

... и получаю файловый дескриптор сокета:

int socket_fd = client->getSocketFd();

, потому что я хочу, чтобы эта часть программы использовалаСокет TCP / IP для отправки пакетов по этому сокету.Но тогда моя программа segfaulting с этой ошибкой:

#1  0x000000000041fab0 in boost::asio::detail::task_io_service_operation::complete(boost::asio::detail::task_io_service&, boost::system::error_code const&, unsigned long) ()
#2  0x0000000000420b5f in boost::asio::detail::task_io_service::do_run_one(boost::asio::detail::scoped_lock<boost::asio::detail::posix_mutex>&, boost::asio::detail::task_io_service_thread_info&, boost::system::error_code const&) ()
#3  0x00000000004207df in boost::asio::detail::task_io_service::run(boost::system::error_code&) ()
#4  0x0000000000420eab in boost::asio::io_service::run() ()

Есть ли у вас какие-либо подсказки о том, что здесь происходит?

1 Ответ

0 голосов
/ 13 февраля 2019

Вы определяете io_service в стеке в одном потоке.Но вы получаете доступ к нему из другого потока.Кажется, что объект больше не жив в момент вызова .run().

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...