Abort() 已被调用 - 连接函数多线程 Cpp

4 c++ sockets multithreading bittorrent thread-safety

我正在尝试使用多线程来连接多个对等端 simultinaly。当我运行我的代码并运行一个线程时,程序在“连接”函数中崩溃并写道:“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));
    }
}
Run Code Online (Sandbox Code Playgroud)

peer 是我在尝试实现 bittorent 协议时需要连接的另一个客户端。

同样,当有一个线程时一切正常,当我有两个以上的同行时,一切都崩溃了。

Die*_*ühl 10

当一个std::thread对象被销毁时,它是不允许的joinable(),即,在它被销毁之前必须发生两件事之一:

  1. 它被分离了,线程已经被破坏了,几乎无法控制它是否完成。
  2. 该线程已被join()编辑。

如果一个std::thread对象在没有这些状态中的任何一个的情况下被销毁,std::terminate()则调用这可能是调用abort()您观察的原因。在您的循环中,您一直在破坏线程而没有调用它们detach()或调用join()它们。系统将其视为终止程序的请求。

如果您需要此行为的参考:请参阅 30.3.1.3 [thread.thread.destr] 第 1 段:

~thread();

如果joinable(),调用std::terminate()。否则,没有任何影响。[注意:joinable()在其析构函数中隐式分离或加入线程可能导致难以调试正确性(for detach)或join仅在引发异常时遇到的性能(for )错误。因此,程序员必须确保在线程静止时绝不会执行析构函数joinable。——尾注]