【问题标题】:Abort() has been called - Connect Function multithreads Cpp已调用 Abort() - Connect Function 多线程 Cpp
【发布时间】:2016-03-23 16:25:45
【问题描述】:

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

同样,当有一个线程时一切正常,当我有两个以上的对等方时,都会崩溃。

【问题讨论】:

  • 什么是peers,什么是peersArr。你确定peers.GetSize() 不大于peersArr 的大小吗?请发帖MVCE
  • 我编辑了我的问题 :)

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


【解决方案1】:

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

  1. 它被分离了,线程已经进入野外,几乎无法控制它是否完成。
  2. 线程已被join()ed。

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

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

~thread();

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

【讨论】:

  • 谢谢!但是,如果我希望我的程序继续运行(例如对于 gui),我该怎么办我应该在线程内的线程内创建一个线程吗?这是一个好的解决方案吗?
  • @YoavFranco:您很可能会将您的 std::thread 对象保留在周围,例如,在 std::vector&lt;std::thread&gt; 中或在合适的位置添加一些附加信息。这样,您还可以有一个线程清理要终止的线程(即,join()ing 他们)。具体如何完成取决于您的程序结构。
  • @dietmar-kuehl 谢谢,将我的线程存储在std::vector&lt;std::thread&gt; 中,并在我想终止时(例如在 main 结束时)通过循环遍历向量将它们一一加入是正是我现在正在做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多