在closesocket之后服务器崩溃

时间:2017-02-18 18:45:33

标签: multithreading winsock

我有多线程应用程序,它定期轮询几百个设备。 每个线程服务一个设备,其套接字和其他描述符封装在单个对象上,因此没有共享描述符。 在我尝试将描述符fSock设置为0时偶尔应用程序在closesocket(fSock)之后崩溃。

我假设,如果closesocket(fSock)返回SOCKET_ERROR,我不应该设置fSock = 0。 或者还有其他原因吗?

我的代码:

StrCompare

1 个答案:

答案 0 :(得分:0)

  

我有多线程应用程序,... [它]偶尔会崩溃

偶尔崩溃的多线程应用程序是竞争条件的典型症状。我认为要防止崩溃,你需要弄清楚你的代码中的竞争条件,并解决它。

  

我假设,如果closesocket(fSock)返回,我不应该设置fSock = 0   SOCKET_ERROR。或者还有其他原因吗?

我怀疑问题实际上与closesocket()或将fSock设置为0有关。请记住,套接字实际上只是整数,将整数设置为0并不会导致自身崩溃。 可能导致崩溃的是对无效内存的写入 - fSock = 0会写入成员变量fSock所在的内存位置。< / p>

因此,更可能的假设是,当线程A仍然在调用Connect()时,线程B删除了_EthDev对象。这很可能发生在执行connect()调用时,因为阻塞connect()调用可能需要相对较长的时间才能返回。因此,如果有另一个线程在connect()调用期间粗略地删除了_EthDev对象,那么只要connect()返回,下一行代码就会写入使用(现在已删除)_EthDev对象的位置将成为&#34; fSock = 0;&#34;线,这可能会导致崩溃。

我建议您查看删除_EthDev对象的代码,如果在删除之前不小心首先关闭使用这些对象的任何线程(并等待线程退出!) _EthDev对象,你应该重写它,以便它可靠地执行。在另一个线程可能仍在使用它的同时删除一个对象是一个问题。