我正在尝试使用多线程来连接一个或多个同等对象。
当我运行我的代码并运行一个以上的线程时,该程序在“连接”函数中崩溃,并写道:“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段:

    09-25 15:05