日期:2014-05-17  浏览次数:21151 次

多线程相关问题
写了一个监控网络阻断的小程序,代码概要如下:

//对每个监控IP,开启一个线程,里面进行while循环
Ping ping = new ping();

 while(true)
{
    pingreply1 = ping.send(IP);
    sleep(XX);
    pingreply2 = ping.send(IP);
    dang reply1和2都不是success的时候,就告警
}


当监控IP比较少的时候,没有问题,但是如果监控地址较多,如20个,在运行较长时间后如24小时后,时不时就会出现连续两个timeout,然后程序告警,但是通过我直接在控制台中监测这个IP,发现虽然有丢包,但是连续丢两个的情况极少,望大家帮忙分析下原因,还有就是给想个控制多个线程不要同时执行的办法。
我个人是想弄个flag,然后再开一个线程修改flag的值,还有没的更好,更简单的办法呢
while(true)
{   if(flag)
   { pingreply1 = ping.send(IP);
    sleep(XX);
    pingreply2 = ping.send(IP);
    dang reply1和2都不是success的时候,就告警  
   }
   else
   {
    sleep(XX)
   }
}


我个人猜测:会不会是两个线程同时发起了Ping.send,导致其中一个timeout?
多线程?冲突

------解决方案--------------------
会不会是两个线程同时发起了Ping.send,导致其中一个timeout?  应该不会吧,你不使用了 pingreply1 、 pingreply2两个对象来send吗
------解决方案--------------------
我突然想到一个问题,如果用一台PC大量的产生线程去ping另一台PC,会使另一台PC网络阻塞吗?
------解决方案--------------------
用锁就不会同时执行了
建议改用SendAsync看
------解决方案--------------------
如果是通信端口阻塞的原因,可以考虑异步模式,使用队列控制对端口的访问,这样就不会后资源冲突的情况发生了。
------解决方案--------------------
直接使用Time控件,每隔一段时间执行一次不就好了吗?