大牛们,来看看小弟的线程异常... ( 积分: 50 )

  • 主题发起人 l0v3_y1n9
  • 开始时间
L

l0v3_y1n9

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟写了一个DLL让某个EXE加载,DLL里面代码很简单,主线程用CreateThread函数创建两条子线程,而子线程的代码都用如果方式
while Truedo
begin
//省略部分代码
Sleep(2000);
end;
这样的方式实现死循环执行特定代码,两条线程所执行代码都不同,但是都是不定时出现宿主(则被加载本人写的DLL文件的进程)死掉,提示DLL的某个编移地址出错.什么异常之类的...
如果不创建那两条子线程则不会有事.请问各位大牛,是不是这样的写法有错误呢?或者有什么思路望给予指导,谢谢!
 
线程里使用sleep是非常不安全的,这个是常识。
 
我不太赞成楼上的说法,在线程里面,应该使用Sleep(如果你的是一个死循环),否则你的CPU的使用率会高达90%多,当然不是死循环,就可以不用Sleep.
个人认为,你不妨试一下有主线程加载DLL,那样就不会发生你的现象了
 
不能让线程执行中的异常扩散出去,这个是常识。。。
所以线程中的代码都应该是
try
....
except
....这里做异常处理工作
end;

因此,楼主的"//省略部分代码"
这个地方才是关键,在中间抛出异常的话,没有做任何保护措施,发生异常程序必死无疑--不要忘记了,DLL和EXE是在同一个进程空间中的。
线程中的无限循环,有两点建议:
1.必须要Sleep(>1),或者等待其它信号量(超时>1),否则CPU利用率100%
2.要有检测线程退出循环的地方,在外部用终止线程的方法并不安全,起码不知道线程终止时正执行到哪一行代码,程序完全不可控。
 
顶部