这几天看《widows核心编程》书上HandShake的代码,发现了一个问题,猜想程序可能会因此陷入死锁状态。 后经实际测试,发现这确实是一个BUG。再后来,修改了部分代码,BUG消失了。 特发出来与大家分享。有什么不对的地方,还希望大家能够指出。 widows核心编程(第4版)HandShake程序有一个BUG—— 如果在Request编辑框里输入字符串Server Shutdown,点击提交按钮,服务器线程会终止。 然后在编辑框里输入任意字符串,再次点击提交按钮时,由于服务器线程已经终止,所以事件 g_hevtResultReturned 不会被设置为通知状态,主线程陷入死锁。 本程序对其进行了改动。改动如下: (1)主线程在提交请求之前,检查服务器线程是否已经终止。如果已经终止,则不进入等待函数。 否则,提交请求,并进入等待函数。 (2)为了让主线程能够检查服务器线程是否已经终止,将服务器线程句柄设置为全局变量。 (3)DialogBox返回之后,主线程仍然可能陷入死锁。原因同上。为此,添加检测服务器线程是否已经终止的代码。 如果服务器线程已经终止,则直接进入清理句柄步骤。 否则,发送字符串Server Shutdown,令其终止,待终止后再进入清理句柄步骤。 另一种修改方法是,只等待服务器线程终止,而不等待事件g_hevtResultReturned被设置为通知状态。 修改后的代码如下:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)