我正在尝试使用多线程来连接一个或多个同等对象。
当我运行我的代码并运行一个以上的线程时,该程序在“连接”函数中崩溃,并写道:“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));
}
}
同行是我尝试实现痛苦协议(protocol)时需要与之连接的另一个客户端。
同样,当只有一个线程时,一切正常,而当我有两个线程时,则所有崩溃。
最佳答案
当std::thread
对象被销毁时,不允许将其变为joinable()
,即,销毁该对象之前必须发生以下两种情况之一:
join()
编辑。 如果
std::thread
对象被销毁而没有这两种状态,则std::terminate()
会被调用,这可能是您观察到的abort()
调用的原因。在循环中,您不断破坏线程,而没有在它们上调用detach()
或join()
。系统将其视为终止程序的请求。如果需要此行为的引用:请参见30.3.1.3 [thread.thread.destr]第1段: