Abort () был вызван — Функция подключения многопоточности Cpp

Я пытаюсь использовать многопоточность для подключения более чем к одному одноранговому пользователю.
Пока я выполняю свой код и выполняю более одного потока, программа вылетает в функции «connect» и пишет: «Abort () вызван».

Вот как я обращаюсь к темам:

TcpPeers(OrderedMap<std::string, unsigned short> peers, std::string     infoHash)
{
this->peers = peers;
peersArr = new Peer[peers.GetSize()];

for (int i = 0; i < peers.GetSize(); i++)
{
Peer * pp = new Peer(peers.GetKeyByIndex(i), peers.GetValueByIndex(i), infoHash);
*(peersArr + i) = *pp;
}

for (int i = 0; i < peers.GetSize(); i++)
{
std::thread t1(&Peer::CreateConnection, *(peersArr + i));
}
}

Одноранговый узел — это еще один клиент, с которым мне нужно связаться, пока я пытаюсь реализовать протокол bittorent.

Опять же, когда есть один поток, все идет хорошо, когда у меня более двух пиров, все вылетает.

2

Решение

Когда std::thread объект разрушается, ему нельзя joinable()то есть одна из двух вещей должна произойти до того, как она будет уничтожена:

  1. Это было отделено, и нить ушла в дикую природу, и нет почти никакого контроля над тем, закончил ли он или нет.
  2. Тема была join()редактор

Если std::thread объект разрушен без какого-либо из этих состояний, std::terminate() называется, что, вероятно, является причиной для вызова abort() вы наблюдаете В вашем цикле вы продолжаете уничтожать потоки, не вызывая ни detach() или же join() на них. Система видит это как запрос на прекращение вашей программы.

Если вам нужна ссылка для этого поведения: см. Пункт 30.3.1.3 [thread.thread.destr]:

~thread();

Если joinable(), звонки std::terminate(), В противном случае не имеет никакого эффекта. [Примечание: либо неявно отсоединяется, либо присоединяется к joinable() поток в его деструкторе может привести к затруднению отладки правильности (для detach) или производительность (для join) ошибки встречаются только при возникновении исключения. Таким образом, программист должен убедиться, что деструктор никогда не выполняется, пока поток все еще joinable, —Конечная записка]

1

Другие решения

Других решений пока нет …