关于多线程安全和Socket堵塞
我只一个用户名,所以没有可用分转让之类的东东,没分了,所以本贴只有10分,原谅原谅
不少人在多线程上误解挺深的,我举个例子总结一下吧,算上版主上任第一篇谢贴:
class a:
lock (a){
//code
lock(b){
//code
}
}
class b:
lock (b){
//code
lock(a){
//code
}
}
假若,上面二个线程任意一个出现中止或挂起,将导致二个线程都死锁,永久进入睡眠状态。因为他们都在等待对方解锁。
这是一个比较容易犯的错误,这也是为什么thread.abort 要抛出异常的原因,目的就是让你知道线程异常中止,要你自己注意是否有要善后的处理。不少的贴子我都有警告过,必须要设置一个公用变量数组(推荐使用sortlist 之类的二维表),在各线程的while 内部去判断是否线程应该中止!
有些朋友提到了碰到了socket 堵塞式多线程怎么办?其实不然,那其实是你的编程误区,socket 的AcceptSocket 应该这样写(取自我过去写的sock 聊天程序):
while (cls_Const.ListenStartMode) {
if (!listener.Pending()) {
Thread.Sleep(cls_Const.ListenThreadSleep);
}
else if (!cls_Const.ServiceStartMode) {
Socket sockServer = listener.AcceptSocket();
...
}
相信cls_Const.ListenStartMode 你应该知道是什么用吧,就是控制线程是否继续运行的变量
而 cls_Const.ListenThreadSleep 是负责睡眠时间也就是socket 接受请求的间隔,目的只是为了保证CPU 在while 体内 不会跑到100%
最后要补充的是要注意定义:
sockServer.SetSocketOption(
SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout,
cls_Const.revSockTimeOut
);
sockServer.SetSocketOption(
SocketOptionLevel.Socket,
SocketOptionName.SendTimeout,
cls_Const.sendSockTimeOut
);
里面的timeout 我想应该是知道什么意思吧,就是超时的毫秒