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.
Опять же, когда есть один поток, все идет хорошо, когда у меня более двух пиров, все вылетает.
1 ответ
Когда std::thread
объект разрушается, ему нельзя joinable()
одна из двух вещей должна произойти до того, как она будет уничтожена:
- Это было отделено, и нить ушла в дикую природу, и нет почти никакого контроля над тем, закончил ли он или нет.
- Тема была
join()
редактор
Если std::thread
объект разрушен без какого-либо из этих состояний, std::terminate()
называется, что, вероятно, является причиной для вызова abort()
вы наблюдаете В вашем цикле вы продолжаете уничтожать потоки, не вызывая ни detach()
или же join()
на них. Система видит это как запрос на прекращение вашей программы.
Если вам нужна ссылка для этого поведения: см. Пункт 30.3.1.3 [thread.thread.destr]:
~thread();
Если
joinable()
, звонкиstd::terminate()
, В противном случае не имеет никакого эффекта. [Примечание: либо неявно отсоединяется, либо присоединяется кjoinable()
поток в его деструкторе может привести к затруднению отладки правильности (дляdetach
) или производительность (дляjoin
) ошибки встречаются только при возникновении исключения. Таким образом, программист должен убедиться, что деструктор никогда не выполняется, пока поток все ещеjoinable
, —Конечная записка]