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(),即,在它被销毁之前必须发生两件事之一:
join()编辑。如果一个std::thread对象在没有这些状态中的任何一个的情况下被销毁,std::terminate()则调用这可能是调用abort()您观察的原因。在您的循环中,您一直在破坏线程而没有调用它们detach()或调用join()它们。系统将其视为终止程序的请求。
如果您需要此行为的参考:请参阅 30.3.1.3 [thread.thread.destr] 第 1 段:
~thread();如果
joinable(),调用std::terminate()。否则,没有任何影响。[注意:joinable()在其析构函数中隐式分离或加入线程可能导致难以调试正确性(fordetach)或join仅在引发异常时遇到的性能(for )错误。因此,程序员必须确保在线程静止时绝不会执行析构函数joinable。——尾注]
| 归档时间: |
|
| 查看次数: |
7806 次 |
| 最近记录: |