我正在尝试使用多线程来连接多个同行。 当我运行我的代码并运行更多然后一个线程时,程序在“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协议时,对等体是我需要连接的另一个客户端。
同样,当有一个线程全部正确时,当我有两个以上的对手全部崩溃时。
答案 0 :(得分:1)
当std::thread
对象被销毁时,不允许joinable()
,即在销毁之前必须发生以下两件事之一:
join()
编辑。如果在没有这些状态的情况下销毁std::thread
对象,则会调用std::terminate()
,这可能是您观察到的abort()
调用的原因。在你的循环中,你继续销毁线程,而不是在它们上面调用detach()
或join()
。系统将此视为终止程序的请求。
如果您需要此行为的参考:请参阅30.3.1.3 [thread.thread.destr]第1段:
~thread();
如果
joinable()
,请致电std::terminate()
。否则,没有任何影响。 [注意:在析构函数中隐式分离或加入joinable()
线程可能导致难以调试正确性(对于detach
)或性能(对于join
)仅在异常时遇到错误提高。因此,程序员必须确保在线程仍为joinable
时永远不会执行析构函数。 - 后注]