gpt4 book ai didi

c++ - 多线程 - 断开 TCP 连接

转载 作者:行者123 更新时间:2023-11-28 08:24:59 26 4
gpt4 key购买 nike

我创建了一个线程来接收一个阻塞套接字,它一直等到数据包到达。但是,当我尝试断开与主线程的连接时,线程之间会出现竞争条件,从而导致错误。

这里的切换发生在线程之间的第 5 行,实际上并没有完成断开连接调用。

void Disconnect() {
if(isConnected) {
if (closesocket(sockClient) != SOCKET_ERROR) {
isConnected = false;
}
}
}

我应该如何避免切换并优雅地让它完成断开连接调用?

最佳答案

这里有两种可能的解决方案。

您可以在套接字(非主)线程中隔离所有套接字访问,而不是从主线程断开套接字,让该线程向非主线程发出需要断开连接(或其他一些操作)的信号。这将需要您的辅助线程等待两个对象 - 套接字和指示需要断开连接的信号器(例如,Win32 Event)。

另一方面,如果您想允许主线程断开连接(就像您现在所做的那样),您需要检查所有使用套接字的代码,并使用锁保护使其成为线程安全的,以确保并发访问套接字和关联的状态数据被阻止。 Boost.Thread有合适的锁,你可以在这里使用,否则你可以在类似 Win32 CriticalSection 的东西上实现你自己的作为包装器.

第二个是我的首选解决方案 - 事实上,您问这个问题意味着您需要回过头来考虑设计中的线程安全性。即使您采用上面的第一个想法,您仍然可能需要维护状态以避免从主线程发送多个断开连接信号,并且必须进行锁定保护。此外,如果您希望非主线程处理“断开连接”以外的传入事件,则必须在线程之间管理关联状态。

我认为从您现在所处的位置来看,阻力最小的途径是为您现有的代码添加锁定。确保你的锁的范围尽可能窄 - 例如,不要设置你持有的任何可能阻塞或需要很长时间的套接字调用的锁。

关于c++ - 多线程 - 断开 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4354152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com