2010-02-06 121 views
0

我有一个基本的Win32控制台应用程序,它可以调用一个命名管道,然后在一个while(true)循环内调用Sleep(1000)。经过一百次迭代后,睡眠(1000)将挂起。我看不出有什么理由。为什么睡眠(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)。

+0

发布一些代码。 – Joe 2010-02-06 02:54:25

回答

1

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

+0

那么,有没有人看到为什么在我提供的由微软提供的链接中的代码在多个客户端连接时会挂起的原因? – 2010-02-06 04:07:01

+2

我怀疑链接代码挂起。你可能会这样做,因为你不再读取服务器的响应。管道缓冲区将填满容量,然后挂起等待缓冲区排空。 – 2010-02-06 04:38:37

+0

嗯,我运行完全相同的代码,包括客户端在发送消息后读取管道的链接。实际上,我所改变的是,我将客户端示例中的代码移动到了一个名为sendmsg()的单独函数中,然后我只是在while循环中重复调用它,在每次调用后都会休眠。如果你已经理解了这一点,但仍然认为我错过了你的观点,请告诉我,我只想清楚自己在做什么。我可以发布整个客户端代码,它与我链接的代码几乎完全相同。 – 2010-02-06 04:43:54

1

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

分解代码,当它被阻塞并发布堆栈跟踪时。

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

这可能是最好的你发布你正在使用的确切代码。您可能在将代码移入您所调用的函数的过程中犯了错误,并且可能会泄漏资源或导致您出现问题的某些内容。

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