Я пытаюсь использовать многопоточность для подключения более чем к одному одноранговому пользователю.
Пока я выполняю свой код и выполняю более одного потока, программа вылетает в функции «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.
Опять же, когда есть один поток, все идет хорошо, когда у меня более двух пиров, все вылетает.
Когда 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
, —Конечная записка]
Других решений пока нет …