已经调用了Abort() - Connect Function multithreads Cpp

时间:2015-12-17 09:07:46

标签: c++ multithreading sockets thread-safety bittorrent

我正在尝试使用多线程来连接多个同行。 当我运行我的代码并运行更多然后一个线程时,程序在“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协议时,对等体是我需要连接的另一个客户端。

同样,当有一个线程全部正确时,当我有两个以上的对手全部崩溃时。

1 个答案:

答案 0 :(得分:1)

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

  1. 这是分离的,线程进入了野外,几乎无法控制它是否已经完成。
  2. 该帖子已被join()编辑。
  3. 如果在没有这些状态的情况下销毁std::thread对象,则会调用std::terminate(),这可能是您观察到的abort()调用的原因。在你的循环中,你继续销毁线程,而不是在它们上面调用detach()join()。系统将此视为终止程序的请求。

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

      

    ~thread();

         

    如果joinable(),请致电std::terminate()。否则,没有任何影响。 [注意:在析构函数中隐式分离或加入joinable()线程可能导致难以调试正确性(对于detach)或性能(对于join)仅在异常时遇到错误提高。因此,程序员必须确保在线程仍为joinable时永远不会执行析构函数。 - 后注]