奇怪的现象,在线程中使用SOCKET,该线程有时会退出,导致程序退出.

时间:2022-09-27 18:22:53
如题:
    开了一个县城使用socket接收数据,并将接收到的数据放到一个缓冲区中;
    又开了一个县城从这个缓冲区中读取数据;
    但接收数据的缓冲区有时会莫名其秒的当掉,有时甚至导致整个程序退出,使用GetLastError()又得不到什么错误,唉,真的好奇怪,是县城的问题还是SOCKET的问题呢?

9 个解决方案

#1


缓冲区是临界资源,应该加锁。

#2


: anjy(泡泡oοО○) 
  谢谢,我用了mutex,可以吗?

#3


应该是线程的问题吧!

#4


我用了mutex了,也用waitforsingleobject()了.
socket主要是写在dll中了,在我这边的县城中调用,出现以上问题;

我想可能不是多县城共用缓冲区的问题,我将另外一个县城注释掉,仍然会出现这个问题,难道是DLL的问题?

这个DLL在另一个WIN32程序中调用,没什么问题,如果不动键盘和鼠标的话,如果一动键盘和鼠标,这个程序就会不声不响的退出,也不出错误框。很奇怪哟!

#5


前一段时间同样遇到这样的问题,或许能提供些有价值的资料,但我需要以下信息:
该程序详细的环境(单/双CPU、操作系统及版本、平均可以持续的时间、无连接情况下的运行状态)。

#6


程序运行的环境:
1.单cpu :p4 1.70  memory:256m
2.win2000 sp3
3.运行时间:从我上班开机到我下班关机
4.无连接时停下不动

#7


我以前的鸡子装了个防火墙,socket也是总是奇怪的断~~~  , debug看堆栈发现是死在ndis层里了~~~   
 冬冬的每个socket线程都有自己的缓冲区对象,
 每个缓冲区都带自己的CS,对缓冲的读写都有CS保护
 所有的缓冲区的交互都通过"线程祖先"的缓冲管理类对象控制,
 该缓冲管理类对象与监视控制每个socket线程的通讯管理类对象平级,都由"线程祖先"创建
 
据"X.T & X.P 's  Delphi 5 Developer's Guide " 
   提示  临界区与事件对象(比如互斥对象)的最大区别是在性能上。临界区在没有线程冲突时,要用10-15个时间片,而事件对象由于涉及到系统内核要用400-600个事件片。

#8


我的机子可没firewall

#9


建议你使用EnterCriticalSection和LeaveCriticalSection
在线程中使用共享内存,需要仔细调试。
CriticalSection保证了在同一时间下,只有一个线程能够访问共享内存。

#1


缓冲区是临界资源,应该加锁。

#2


: anjy(泡泡oοО○) 
  谢谢,我用了mutex,可以吗?

#3


应该是线程的问题吧!

#4


我用了mutex了,也用waitforsingleobject()了.
socket主要是写在dll中了,在我这边的县城中调用,出现以上问题;

我想可能不是多县城共用缓冲区的问题,我将另外一个县城注释掉,仍然会出现这个问题,难道是DLL的问题?

这个DLL在另一个WIN32程序中调用,没什么问题,如果不动键盘和鼠标的话,如果一动键盘和鼠标,这个程序就会不声不响的退出,也不出错误框。很奇怪哟!

#5


前一段时间同样遇到这样的问题,或许能提供些有价值的资料,但我需要以下信息:
该程序详细的环境(单/双CPU、操作系统及版本、平均可以持续的时间、无连接情况下的运行状态)。

#6


程序运行的环境:
1.单cpu :p4 1.70  memory:256m
2.win2000 sp3
3.运行时间:从我上班开机到我下班关机
4.无连接时停下不动

#7


我以前的鸡子装了个防火墙,socket也是总是奇怪的断~~~  , debug看堆栈发现是死在ndis层里了~~~   
 冬冬的每个socket线程都有自己的缓冲区对象,
 每个缓冲区都带自己的CS,对缓冲的读写都有CS保护
 所有的缓冲区的交互都通过"线程祖先"的缓冲管理类对象控制,
 该缓冲管理类对象与监视控制每个socket线程的通讯管理类对象平级,都由"线程祖先"创建
 
据"X.T & X.P 's  Delphi 5 Developer's Guide " 
   提示  临界区与事件对象(比如互斥对象)的最大区别是在性能上。临界区在没有线程冲突时,要用10-15个时间片,而事件对象由于涉及到系统内核要用400-600个事件片。

#8


我的机子可没firewall

#9


建议你使用EnterCriticalSection和LeaveCriticalSection
在线程中使用共享内存,需要仔细调试。
CriticalSection保证了在同一时间下,只有一个线程能够访问共享内存。