为什么Sleep(1000)导致死锁?

时间:2010-02-06 02:47:52

标签: windows visual-studio-2008 visual-c++ winapi

我有一个基本的Win32控制台应用程序,它在一个while(true)循环内调用命名管道,然后调用Sleep(1000)。经过一百次迭代后,Sleep(1000)将挂起。我没有理由这样做。

好的,我正在做的就是获取此MSDN示例中的代码,逐字逐句并将其作为服务器运行:http://msdn.microsoft.com/en-us/library/aa365601%28VS.85%29.aspx

然后我将此MSDN示例中的代码用于此处找到的客户端:http://msdn.microsoft.com/en-us/library/aa365592%28VS.85%29.aspx,并对其进行修改,以便将所有调用代码移动到单独的方法中,然后从main()中移动称之为:

   while (true)
   {
       sendmsg();
       Sleep(1000);
   }

我应该补充一点,当我运行客户端的多个实例时,问题就发生了,比如4个或5个实例。我没有理由这样做。根本没有同步发生。代码与两个链接完全相同,除了在循环中运行客户端代码的更改,每次调用后都有Sleep(1000)。

2 个答案:

答案 0 :(得分:1)

睡不着。注意调试器行为,如果它没有活动代码的任何源代码,它往往会在下一个语句上放置绿色箭头。看到管道呼叫挂起是很正常的。在Debug + Break All之后,确保将堆栈跟踪向上滚动到操作系统代码中的帧。

答案 1 :(得分:1)

那么,当多个客户端正在运行并且在显示的紧密循环中连接和发送时,一个(或多个?)客户端会阻塞?

当代码阻塞并发布堆栈跟踪时,请进入代码。

当所有管道实例都忙时,您确定在示例代码中发生的20秒等待中没有阻塞吗?我认为这不太可能,但有可能......

最好发布您正在使用的确切代码。您可能在将代码移动到正在调用的函数中时犯了错误,并且可能会泄漏资源或导致您出现问题的内容。

由于您正在运行多个客户端,因此从每个客户端输出一个循环计数器可能会很有用,以显示它们在您遇到问题之前每次执行的迭代次数;也许它总是与总迭代次数相同?您是否与更多客户挂得更快?客户较少,速度较慢?