【问题标题】:Why is Sleep(1000) resulting in a deadlock?为什么 Sleep(1000) 会导致死锁?
【发布时间】:2010-02-06 20:30:08
【问题描述】:

我有一个基本的 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)。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 话虽如此,有没有人看到我提供的链接中的代码在多个客户端连接时会挂起的原因?
    • 我怀疑链接代码挂起。您的可能是因为您不再读取来自服务器的响应。管道缓冲区将填满,然后挂起等待缓冲区耗尽。
    • 好吧,我正在运行与我链接的完全相同的代码,包括客户端在发送消息后读取管道。事实上,我所做的只是将客户端示例中的代码移动到一个名为 sendmsg() 的单独函数中,然后我只是在 while 循环中重复调用它,每次调用后都休眠。如果您已经理解了这一点并且仍然认为我错过了您的观点,请告诉我,我只是想清楚我在做什么。我可以发布整个客户端代码,它与我链接的几乎相同。
    【解决方案2】:

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

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

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

    最好发布您正在使用的确切代码。您可能在将代码移动到您正在调用的函数中的方式上犯了一个错误,并且您可能会泄漏资源或其他导致您出现问题的东西。

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

    【讨论】:

      猜你喜欢
      • 2015-03-09
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多