| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Sleep(0) или Sleep(1) |
| Автор: azesmcar 21.3.2007, 17:11 | ||||||||
| Здравствуйте.. Возникла такая проблема. Есть поток который в цикле обрабатывает данные.
Этот поток по известным причинам жрет 50% ресурсов у процессора. Создадим еще один поток на эту функцию и он начнет забирать 100%. Все верно, после каждой итерации надо ставить Sleep( 0 ). Вот только эффекта от этого Sleep( 0 ) никакого. Все остается по прежнему...SwitchToThread дает аналогичный результат...Ставлю Sleep( 1 ) все в порядке...просто работает раз в 700 медленее (проверял).. В чем собственно дело? Если не ошибаюсь (причем не только я но и дядюшка Рихтер) то Sleep( 0 ) должен был решить эту проблему... Может я не так проверяю но
этот код выдает
а тот же код с Sleep(1) выдает
|
| Автор: Earnest 21.3.2007, 17:27 |
| Я не совсем понимаю, в чем вопрос или проблема. Sleep (0) не жрет время зря, а просто отдает управление системе (а та - следующему потоку). Sleep(1) - тоже самое, но еще и простаивает. А даже за одну мс много итераций сделать можно. (Причем я как-то сомневаюсь, что он спит только 1, скорее все 10 - по крайней мере, такая дискретность у таймера). Так что разница во времени выполнения понятна. В чем вопрос-то? Как тебе достичь - чего? |
| Автор: W4FhLF 21.3.2007, 17:31 |
| Да просто всё. При Sleep(0) поток не усыпляется, а система просто отдаёт время планировщику, а тот сразу же вновь твоему потоку, потому что, судя по-всему, нет других потоков нуждающихся во времени. А при Sleep(1) поток усыпляется, добавляется запись в управляющую структуру, после чего система ждёт прерывания от таймера, при возникновении прерывания она ставит твой поток в конец очереди планировщика. Это очень упрощённо, для понимания этой схемы чтиво Рихтера слишком поверхностно. Добавлено @ 17:32 Опередили. |
| Автор: Tectoder 21.3.2007, 19:07 |
| На самом деле эффект есть. Он проявится как только в системе окажеться еще один конкурирующий поток. Так что юзай это или SwitchToThread и успокойся. |
| Автор: azesmcar 21.3.2007, 22:06 | ||||||
Я тоже так думал..оказалось нет Sleep( 2 ) в моем примере выдает результат вдвое меньше чем в Sleep( 1 ).
В том и проблема что процессор дохнет...100% usage это разве не проблема?
Под эффектом я подразумеваю usage процессора. В моем примере 4 потока которые вместе забирают 100% процессорских ресурсов. Это нормально? |
| Автор: Tectoder 21.3.2007, 22:09 |
| Да. Ты боишься что он перетрудится? SwitchToThread нужно для предотвращения "дегродации" системы(правда, тут этот термин не совсем в тему, ну да ладно). Он никак не снизит загрузку процессора. |
| Автор: azesmcar 21.3.2007, 22:17 | ||
Почему же тогда Sleep(1) снижает? |
| Автор: Earnest 21.3.2007, 23:00 |
| Спят они у тебя там все вместе... Ты что, компьютер пожалел? |
| Автор: Tectoder 22.3.2007, 00:35 |
| Труд сделает из компьютера обезьяну |
| Автор: azesmcar 22.3.2007, 09:43 | ||
Ну откровенно говоря нет...меня скорее смутил факт что один такой поток забирает 50%, два - 100%...а у меня таких потоков должно быть около 10..и меня терзают сомнения что все эти потоки совместно будут работать нормально...Кстати работать они должны беспрерывно..днями и ночами..короче говоря трудиться будут как негры на плантациях...Компания интел не подаст на меня в суд за порабощение ихнего производства? Добавлено @ 09:51 Добавил в свой пример еще 10 потоков...в результате программа забирает у процессора все что вообще возможно и оказалось...стала она работать на порядок медленее чем с 4 потоками. В случае же с Sleep( 1 ) результат остался прежним. Теперь разница в скорости работы стала около 150 раз..еще несколько потоков и скорость станет одинаковой. Плюсь процессор не будет так нагружен...хммм, я в сомнениях..что же делать? |
| Автор: Earnest 22.3.2007, 10:18 |
Больше 100% никак не возьмут. С чего это ты взял? При большом числе потоков просто нет совместного простоя. Процессор (одноядерный) в любом случае больше потока одномоментно выполнять не может. Да не грузись ты ерундой! Решат проблемы надо по мере их поступления, а не заранее придумывать - а вдруг! Кроме того - а какие у тебя альтернативы: ставить Sleep(1) или нет? Ну поставишь потом, если решишь, что надо. Кстати - зачем тебе самому переключать потоки? Но, допустим, даже если действительно нужно - итерации должны быть гораздо крупнее: переключения то не бесплатны... |
| Автор: azesmcar 22.3.2007, 10:40 | ||||||||
Оптимистично
С примера, ставлю Sleep(1) нагрузка процессора 0%.
Проблема в том что 10 потоков с Sleep(0) так пожирают ресурсы что администрировать сервер уже становится невозможным. А остановить сервис на время не дело. Он не должен останавливаться вообще теоретически.
Если не переключать потоки вообще то некоторым из моих же потоков управление не передается вообще. В принципе ставить Sleep(1) не такая уж проблема, несколько милисекунд простоя на затормозят мою программу до невозможности. Вопрос в том правильно ли это? Я просто никогда не видел программу которая бы постоянно так жрала ресурсы процессора и мне поведение моей программы кажется странным. Может у меня организация потока неверно сделана если уж он никогда не спит..Просто по другому не представляю как? Non Blocking Server Socket чидает данные и выдает события...больше ничего кроме этого и обработки этих самых событий от потока не требуется. |
| Автор: Earnest 22.3.2007, 11:07 |
| Согласна с предыдущем оратором. Если ты непрерывно спрашиваешь, а нет ли чего для меня - то это неправильно. Тогда действительно, сожрешь все, что есть. |
| Автор: azesmcar 22.3.2007, 11:11 | ||
А как иначе? У меня есть лист сокетов которые ко мне присойденены. Если сделать их Blocking сокетами то recv будет спать на конкретном сокете пока от него не придет сообщение а на сообщение от остальных ему глубоко наплевать. Если сделать NonBlocking то когда же ему спать? Вопрос кажется меняется, может стоит его перенести в отдельную тему? |
| Автор: Earnest 22.3.2007, 11:16 |
| Да, наверное, лучше открыть новую тему. Почетче только сформулируй вопрос. Я с сокетами дела не имела, потому не знаю, но наверняка специалисты есть. |
| Автор: azesmcar 22.3.2007, 11:29 |
| Сделал вот ссылка http://forum.vingrad.ru/act-ST/f-99/t-142402/unread-1.html |