Abort() 已被调用 - Connect Function multithreads Cpp
Abort() has been called - Connect Function multithreads Cpp
我正在尝试使用多线程同时连接多个对等点。
当我 运行ning 我的代码和 运行 一个线程时,程序在 "connect" 函数中崩溃并写入:"Abort() has been called".
这是我调用线程的方式:
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 协议时需要连接的另一个客户端。
同样,当有一个线程时一切正常,当我有两个以上的对等点时所有崩溃。
当一个 std::thread
对象被销毁时,它不允许是 joinable()
,即,在它被销毁之前必须发生以下两种情况之一:
- 它被分离了,线程已经失去控制,几乎无法控制它是否完成。
- 线程已
join()
ed。
如果 std::thread
对象在没有这些状态的情况下被销毁,则调用 std::terminate()
,这可能是您观察到调用 abort()
的原因。在您的循环中,您不断销毁线程,而没有调用 detach()
或 join()
。系统将其视为终止程序的请求。
如果您需要此行为的参考:请参阅 30.3.1.3 [thread.thread.destr] 第 1 段:
~thread();
If joinable()
, calls std::terminate()
. Otherwise, has no effects. [ Note: Either implicitly detaching or joining a joinable()
thread in its destructor could result in difficult to debug correctness (for detach
) or performance (for join
) bugs encountered only when an exception is raised. Thus the programmer must ensure that the destructor is never executed while the thread is still joinable
. —end note ]
我正在尝试使用多线程同时连接多个对等点。 当我 运行ning 我的代码和 运行 一个线程时,程序在 "connect" 函数中崩溃并写入:"Abort() has been called".
这是我调用线程的方式:
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 协议时需要连接的另一个客户端。
同样,当有一个线程时一切正常,当我有两个以上的对等点时所有崩溃。
当一个 std::thread
对象被销毁时,它不允许是 joinable()
,即,在它被销毁之前必须发生以下两种情况之一:
- 它被分离了,线程已经失去控制,几乎无法控制它是否完成。
- 线程已
join()
ed。
如果 std::thread
对象在没有这些状态的情况下被销毁,则调用 std::terminate()
,这可能是您观察到调用 abort()
的原因。在您的循环中,您不断销毁线程,而没有调用 detach()
或 join()
。系统将其视为终止程序的请求。
如果您需要此行为的参考:请参阅 30.3.1.3 [thread.thread.destr] 第 1 段:
~thread();
If
joinable()
, callsstd::terminate()
. Otherwise, has no effects. [ Note: Either implicitly detaching or joining ajoinable()
thread in its destructor could result in difficult to debug correctness (fordetach
) or performance (forjoin
) bugs encountered only when an exception is raised. Thus the programmer must ensure that the destructor is never executed while the thread is stilljoinable
. —end note ]