Усиление постов нитей, вызывающих ошибки сегментации при доступе / вставке значений - PullRequest
0 голосов
/ 19 июня 2019

В настоящее время я пишу сетевую структуру, которая просто предписывает серверу прослушивать его собственную ветвь, просто.Всякий раз, когда цепочка вызывается для вызова функции, и эта функция вызывает любые члены внутри класса, возникают ошибки сегментации.

Есть несколько исключений, но особенно эти ошибки сегментации возникают, когда

  1. tcp :: acceptor myAcceptor (my_io_service, myEndpoint)
  2. mySockets.insert (...)

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

Так что же дальше, чтобы подтвердить мое утверждение?Моя последняя попытка была проверить размер mySockets, который, я должен отметить, является map .Я проверил размер до до вызова myStrand.post (...) и проверил размер в вызове функции.Вот что я заметил.

Размеры карты mySockets:

  1. До публикации : 0 (ничего не вставлено, отлично!)
  2. В вызове функции, вызываемой по почте : 999929272 (Ughhhh)

Кажется, что-то пошло не так, но что именно?Создает ли он новый экземпляр, но, как ни странно, это не будет 0?Он не мог потерять адрес, так как это наверняка вызвало бы ошибку сегментации, не так ли?

Вот где я сейчас нахожусь в процессе отладки.

Цель

Конечная цель - получить доступ кmySockets и my_io_service в цепочке сообщений.

Поток макета

Это объясняет макет, хороший код ниже

  1. Create 'работать 'путем передачи io_service
  2. Запустить io_service, вызвав .run ()
  3. Создать TCP-сервер
  4. Назначить параметры для типов членов класса
  5. InvokemyStrand.post (...) для вызова серверов, прослушивания подключающихся клиентов
  6. Ожидание подключения клиента и т. д.

Я выбрал примеры кода, подробно описывающие проблему.

Заголовочный файл

using boost::asio::ip::tcp;
bool amIConnected = false;
boost::asio::io_service::strand myStrand;
boost::asio::io_service& my_io_service;
std::map<std::string, std::shared_ptr<tcp::socket>> mySockets;
tcp::acceptor myAcceptor

Исходный файл

ConstructorStuff::ConstructorStuff(boost::asio::io_service& the_service) : 
myStrand(the_service), 
my_io_service(the_service),
myAcceptor(the_service, tcp::endpoint(tcp::v4(), 1337))
{}

void ConstructorStuff::CreateTheServer()
{
    amIConnected = true;
    // std::cout << mySockets.size() << std::endl; Returns 0
    mStrand.post(std::bind(&ConstructorStuff::ListenForConnection, this));
}

void ConstructorStuff::ListenForConection()
{
    // std::cout << mySockets.size() << std::endl; Crazy size
    tcp::acceptor tryAgain(my_io_service, tcp::endpoint(tcp::v4(), 1338)); // Just to showcase the error doesn't just occur through mySockets.
}

Где ConstructorStuff называется

void SetupServer()
{
    ConstructorStuff stuff(some_service);
    stuff.CreateTheServer();
}

Вызывает указанную выше функцию

ServiceStarter spinup(service);
spinup.Start(); // Just queues reference_service.run()
std::shared_ptr<SomeClass> server_interface(new SomeClass ( service ));
server_interface->SetupServer();
boost::this_thread::sleep(boost::posix_time::seconds(20));
server_interface->Cancel(); // Just another function that kills the server.

Любые предложения будут великолепны!

Примечания :

  • Любые дополнительные значения, такие как скажем myPort , помещенные в файл заголовка, инициализированные в 1337 в CreateTheServer () и затем вызванные в ListenForConnection () будет резко отличаться.
  • Чтобы успокоить любого, кто может спросить, к этим значениям можно получить доступ OUTSIDE strand, таким образом фиксируя эту проблему для проблемы, связанной с strand, которую яИмея.

Редактировать

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

1 Ответ

1 голос
/ 19 июня 2019

Проблема возникает из SetupServer, где stuff - локальная переменная, поэтому после вызова CreateTheServer, stuff был уничтожен и где-то обработчиком io_service::run, отправленным mStrand.post(std::bind(&ConstructorStuff::ListenForConnection, this));, был вызван удаленный объект.Затем std::cout << mySockets.size() << std::endl; напечатал странный результат - это простой пример неопределенного поведения.

...