2.0中,多线程操作socket, 使用send方法时产生死锁!!!!

问题描述

服务器端接收客户端的socket请求,每连接一个新请求,就分配一个新线程,然后调用send()方法,向客户端发送一条数据。现在的问题是:服务器端可以接收并分发线程,客户端也能接收到send()的数据,但是每当send()数据的时候,服务器端就产生死锁(没有响应),CPU100%这是为什么啊?是不是sned()属于不安全线程调用?有什么办法解决啊?谢谢了。

解决方案

解决方案二:
staticobjectobjLock=newobject();在要对同一socket访问时加锁:lock(objLock){//对socket的操作}不要使用lock(this)的方式加锁,这样在多线程中是不行的。
解决方案三:
试下,不知道行不行.
解决方案四:
加上了Lock还是不行啊.
解决方案五:
把代码贴出来吧,有可能不是接收、发送的问题。
解决方案六:
privateintlistenport=2000;privateTcpListenerlistener;privateThreadprocessor;privateSocketclientsocket;privateThreadclientservice;publicForm1(){InitializeComponent();Thread.CurrentThread.IsBackground=true;processor=newThread(newThreadStart(startListening));processor.Start();}privatevoidstartListening(){IPAddressipAddress=Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];IPEndPointipLocalEndPoint=newIPEndPoint(ipAddress,listenport);listener=newTcpListener(ipLocalEndPoint);listener.Start();while(true){try{Sockets=listener.AcceptSocket();clientsocket=s;clientservice=newThread(newThreadStart(ServiceClient));clientservice.Start();}catch(Exceptione){Console.WriteLine(e.ToString());}}}privatevoidServiceClient(){Socketclient=clientsocket;boolkeepalive=true;while(keepalive){Byte[]buffer=newByte[1024];try{client.Receive(buffer);}catch(SocketException){}client.Send(buffer);}}

解决方案七:
上面的代码会产生死锁.是不是应该用BenginSend()啊?
解决方案八:
首先,线程的死锁是不会让CPU100%的。死锁是两个(或更多)线程互相等待互斥量,几乎不占用CPU。你的情况应该是两个Sokcet一直给对方不停的不停的发送数据。你加个Sleep()会解决。但最好用Sokcet类里的异步方式来处理连接,发送,接收.以begin或end开头.性能非常好。
解决方案九:
用poll测下再send要不就阻塞了

时间: 2024-10-29 04:10:57

2.0中,多线程操作socket, 使用send方法时产生死锁!!!!的相关文章

java-代码中子类在调用重名方法时返回结果为null,究竟调用过程是怎样的?

问题描述 代码中子类在调用重名方法时返回结果为null,究竟调用过程是怎样的? class father { private String name; father(String name) { this.name=name; } public String get_name() { return this.name; } } class son extends father { private String name; son(String name) { super(name); } pub

PHP中多线程的两个实现方法_php实例

PHP本身是不是支持多线程的,不过我们可以借助其他的方法来实现多线程,比如 shell 服务,比如 web 服务器,本文我们来讲讲这两个方法如何实现.需要的朋友可以来参考一下. 多线程是java中一个很不错的东西,很多朋友说在php中不可以使用PHP多线程了,其实那是错误的说法PHP多线程实现方法和fsockopen函数有关,下面我们来介绍具体实现程序代码,有需要了解的同学可参考. 当有人想要实现并发功能时,他们通常会想到用fork或者spawn threads,但是当他们发现php不支持多线程

HTML5中CRUD操作方面的实现方法

本文主要对比两者在 CRUD 操作方面的实现方法,按照本文所述读者可以详细了解两者异同. HTML 标准自 1999 年 12 月发布的 HTML 4.01 后,后继的 HTML 5 和其它标准被束之高阁,为了推动 web 标准化运动的发展,一些公司联合起来,成立了一个叫做 Web Hypertext Application Technology Working Group (Web 超文本应用技术工作组 - WHATWG) 的组织,HTML5 草案的前身名为 Web Applications

ASP.NET 2.0中Enter Key最简单处理方法

网页开发中最烦人的事情之一就是为表单处理"Enter key" ,"Enter key"已经成为用户提交表单的偏好.虽然我们为用户提供了提交按钮,但是最简单也是最直接的方式仍然是:输入文字,然后回车完成提交 ASP.NET 2.0中为此提供了很好的解决方法.只需要将"defaultbutton"属性指定到想要引发事件的按钮控件的ID上就可以了. 在表单级别和面板级别(<asp:panel> 标记)均可以指定"defaultb

Java8中聚合操作collect、reduce方法详解

Stream的基本概念 Stream和集合的区别: Stream不会自己存储元素.元素储存在底层集合或者根据需要产生.Stream操作符不会改变源对象.相反,它会返回一个持有结果的新的Stream.3.Stream操作可能是延迟执行的,这意味着它们会等到需要结果的时候才执行.Stream操作的基本过程,可以归结为3个部分: 创建一个Stream.在一个或者多个操作中,将指定的Stream转换为另一个Stream的中间操作.通过终止(terminal)方法来产生一个结果.该操作会强制它之前的延时操

ASP.Net 2.0中实现多语言界面的方法

asp.net 1. 跟以前一样做界面,只是注意,把所有需要有多语言界面的文字都用label来做 2. 做完以后,在Solution Explorer里选中这个文件,选Tools->Generate Local Resource 3. 你会发现生成了一个目录,App_LocalResources:这个目录里多了一个resx的文件.比如你的aspx文件是default.aspx,它就会生成一个叫做default.aspx.resx的文件. 4. 打开这个文件看看,原来在label中的那些文字都跑到

在ASP.Net 2.0中实现多语言界面的方法

1.跟以前一样做界面,只是注意,把所有需要有多语言界面的文字都用 label来做 2.做完以后,在Solution Explorer里选中这个文件,选Tools- >Generate Local Resource 3.你会发现生成了一个目录,App_LocalResources:这个目录里多了一个 resx的文件.比如你的aspx文件是default.aspx,它就会生成一个叫做 default.aspx.resx的文件. 4.打开这个文件看看,原来在label中的那些文字都跑到这里来了 5.打

第四章 在MVC4.0中对脚本以及样式表的引用变化

原文:http://www.cnblogs.com/xdotnet/archive/2012/07/21/aspnet40_webpage20.html 一.可以直接使用"~",而无需使用Href对象实例 这个是一大变化,给我们ASP.NET MVC开发人员带来了很便捷的代码书写方式,提高不少效率.在MVC3.0中加入我们需要加入一张图片时,需要在IMG标签的SRC属性加上 Url.Content或Href对象方法等来对路径进行解析.在WebPage 2.0中Razor模板引擎能够自动

在ASP.NET 2.0中实现本地化

asp.net 摘要: 由于越来越多的跨国公司需要跨语言的WEB应用,所以本地化工作变得尤其重要,在ASP.NET 1.1 中我们使用ResourceManager 类来实现这个工作,而2.0中提供了更加方便的方法和工具来实现. 导言: 现在很多跨国的商务需求都需要实现多语言,对客户来说他们始终想看到网站是用他们所熟悉的语言来显示的,他们不会关注网站使用的是什么技术,而现在的开发工具或者开发技术并没有在本地化方面做的很好,我们还需要花大量的时间和精力去做本地化的工作. ASP.NET2.0的出现