一个电脑最多能开启多少个线程?

by_封爱 版主 2013-11-15 12:02:24
比如:服务器上运行一C#的winForm程序.

Socket方面的 如果有连接就创建一个线程



var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Any, int.Parse(txt_port.Text)));
socket.Listen(10000);//不知道是干啥的 就写10000了
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);


所以在每次有连接的时候 都走了ClientAccepted然后会默认开个线程..

如果2003系统4G内存 最高可以有多少个连接?跟CPU有关系吗?

是不是电脑的线程没了 就死机了?
...全文
15005 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
香克斯的美酒 2014-12-05
  • 打赏
  • 举报
回复
电饭锅
用用婚车 2013-11-18
  • 打赏
  • 举报
回复
貌似有线程池
飞小猪 2013-11-18
  • 打赏
  • 举报
回复
引用 22 楼 gxch 的回复:
xiaozhu39505 小辉? 呵呵,在这里见到你了,好久没联系了,当时我们用 socket异步修改程序后续的情况我不是很清楚了,实际运行后对服务器的占用率有多大? 现在我又一次面对当时的情况了,是一个手机端即时通讯程序,需要连几万个客户端
哈哈,谷哥吗?当时只是测试的可连接数,没有具体测试服务器负载情况。socket异步里就使用了完成端口,用异步是效率最高的,至于负载情况,还得具体测试才行哈
gxch 2013-11-18
  • 打赏
  • 举报
回复
xiaozhu39505 小辉? 呵呵,在这里见到你了,好久没联系了,当时我们用 socket异步修改程序后续的情况我不是很清楚了,实际运行后对服务器的占用率有多大? 现在我又一次面对当时的情况了,是一个手机端即时通讯程序,需要连几万个客户端
kk5595 2013-11-18
  • 打赏
  • 举报
回复
微软操作系统的线程一共才几百个。 你想想你的程序开多了会在怎样
wyufen 2013-11-18
  • 打赏
  • 举报
回复
没有限制,但开多了很慢
showjim 2013-11-18
  • 打赏
  • 举报
回复
引用 16 楼 diaodiaop 的回复:
现在我的需求就跟你这个差不多.. 1W多个 如果在多了呢? 比如100W个下位机. 怎么办?
没有活动的异步连接,基本上只是消耗内存而已。
飞小猪 2013-11-18
  • 打赏
  • 举报
回复
引用 16 楼 diaodiaop 的回复:
[quote=引用 4 楼 xiaozhu39505 的回复:] 我之前做过一个采集的项目,下位机设备会主动TCP连接服务器,用socket异步可以保持1W多个TCP连接
现在我的需求就跟你这个差不多.. 1W多个 如果在多了呢? 比如100W个下位机. 怎么办?[/quote] 百万级别的这个就得做均衡负载了,这个可不是靠程序优化就能解决的
o0冰凉0o 2013-11-18
  • 打赏
  • 举报
回复
by_封爱 版主 2013-11-18
  • 打赏
  • 举报
回复
引用 4 楼 xiaozhu39505 的回复:
我之前做过一个采集的项目,下位机设备会主动TCP连接服务器,用socket异步可以保持1W多个TCP连接
现在我的需求就跟你这个差不多.. 1W多个 如果在多了呢? 比如100W个下位机. 怎么办?
treemo 2013-11-16
  • 打赏
  • 举报
回复
敌敌畏耶 2013-11-16
  • 打赏
  • 举报
回复
开多少线程 和你CPU 有关系···
junlinfushi 2013-11-15
  • 打赏
  • 举报
回复
一个进程可以开启的线程受可用内存限制,如果是32位的机器,那么默认一个进程有2G的可用内存,而每个线程默认分析1M的栈空间,所以这种情况下理论最线程数在2000多个。一个解决办法是创建线程时减少线程栈的大小或是使用64位的系统。64位系统应该可以忽略这个问题了。 当然受cpu及磁盘速度及物理内存的限制。不用到达上限值,你的机器应该已经是慢如牛车了。
E次奥 2013-11-15
  • 打赏
  • 举报
回复
队列!!!!!!!
  • 打赏
  • 举报
回复
socket.Listen(10000);//不知道是干啥的 就写10000了 看方法说明啊 BeginAccept并不是你想的那样执行一次开一个线程,实际情况是bind一个线程池线程,异步执行完后 会放回线程池,池内会保持几个(默认与CPU数量有关)空闲线程活动(减小频繁创建-销毁线程的开销) 池最大可运行的线程数量,可以通过System.Threading.ThreadPool.GetMaxThreads获取,相应地还有个Set方法, 一般情况不需要考虑最大数量(真到那时候加服务器吧),有些情况通过设置最少活动线程SetMinThreads来提高性能
jiaoshiyao 2013-11-15
  • 打赏
  • 举报
回复
表示一个用户一个线程。。。。
卧_槽 2013-11-15
  • 打赏
  • 举报
回复
可以开N多个,N和你的内存大小相关,但是后面的都会挂起。
showjim 2013-11-15
  • 打赏
  • 举报
回复
32位系统一个进程用户空间为2G,一个线程默认需要1M堆栈(最少128K),可以算一算极限。 服务器要么异步(系统队列),要么自己处理队列。 Accept可能没必要异步,用一个线程同步处理更好。 另外活动线程太多的话,频繁的上下文切换很耗CPU。
Null_Reference 2013-11-15
  • 打赏
  • 举报
回复
线程是个好多好东西,但不能滥用。
「已注销」 2013-11-15
  • 打赏
  • 举报
回复
客户端同步异步都可以
加载更多回复(4)

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧