Почему Sleep (1000) приводит к тупику? - PullRequest
0 голосов
/ 06 февраля 2010

У меня есть базовое консольное приложение Win32, которое выполняет вызов по именованному каналу, а затем Sleep (1000) внутри цикла while (true). После ста итераций 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 ]

1 голос
/ 06 февраля 2010

Итак, один (или более?) Из ваших клиентов блокируется, когда несколько клиентов работают, подключаются и отправляют в показанном узком цикле?

Взломать код после его блокировки и опубликовать трассировку стека.

Вы уверены, что не блокируете 20-секундное ожидание, которое происходит в примере кода, когда все экземпляры канала заняты? Я не думаю, что это вероятно, но это возможно ...

Возможно, вам лучше опубликовать точный код, который вы используете. Возможно, вы ошиблись в том, как перенесли код в вызываемую функцию, и у вас могут быть утечки ресурсов или что-то, что впоследствии вызывает у вас проблемы.

Поскольку вы работаете с несколькими клиентами, может быть полезно вывести счетчик циклов для каждого из них, чтобы показать, сколько итераций они выполнили перед тем, как решить вашу проблему; возможно, это всегда одинаковое количество полных итераций? Вы зависаете быстрее с большим количеством клиентов? Менее быстро с меньшим количеством клиентов?

1 голос
/ 06 февраля 2010

Сон не может зависнуть. Следите за поведением отладчика, он имеет тенденцию помещать зеленую стрелку в следующий оператор, если у него нет исходного кода для активного кода. Видеть зависание вызова канала было бы вполне нормально. После Debug + Break All обязательно прокрутите трассировку стека до кадров в коде операционной системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...