![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| azesmcar |
|
||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 5 Всего: 211 |
Здравствуйте..
Возникла такая проблема. Есть поток который в цикле обрабатывает данные.
Этот поток по известным причинам жрет 50% ресурсов у процессора. Создадим еще один поток на эту функцию и он начнет забирать 100%. Все верно, после каждой итерации надо ставить Sleep( 0 ). Вот только эффекта от этого Sleep( 0 ) никакого. Все остается по прежнему...SwitchToThread дает аналогичный результат...Ставлю Sleep( 1 ) все в порядке...просто работает раз в 700 медленее (проверял).. В чем собственно дело? Если не ошибаюсь (причем не только я но и дядюшка Рихтер) то Sleep( 0 ) должен был решить эту проблему... Может я не так проверяю но
этот код выдает
а тот же код с Sleep(1) выдает
Это сообщение отредактировал(а) azesmcar - 21.3.2007, 17:13 |
||||||||
|
|||||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Я не совсем понимаю, в чем вопрос или проблема.
Sleep (0) не жрет время зря, а просто отдает управление системе (а та - следующему потоку). Sleep(1) - тоже самое, но еще и простаивает. А даже за одну мс много итераций сделать можно. (Причем я как-то сомневаюсь, что он спит только 1, скорее все 10 - по крайней мере, такая дискретность у таймера). Так что разница во времени выполнения понятна. В чем вопрос-то? Как тебе достичь - чего? -------------------- ... |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 12 Всего: 121 |
Да просто всё. При Sleep(0) поток не усыпляется, а система просто отдаёт время планировщику, а тот сразу же вновь твоему потоку, потому что, судя по-всему, нет других потоков нуждающихся во времени. А при Sleep(1) поток усыпляется, добавляется запись в управляющую структуру, после чего система ждёт прерывания от таймера, при возникновении прерывания она ставит твой поток в конец очереди планировщика.
Это очень упрощённо, для понимания этой схемы чтиво Рихтера слишком поверхностно. Добавлено @ 17:32 Опередили. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Tectoder |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 202 Регистрация: 13.3.2007 Репутация: 7 Всего: 8 |
||||
|
||||
| azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 5 Всего: 211 |
Я тоже так думал..оказалось нет Sleep( 2 ) в моем примере выдает результат вдвое меньше чем в Sleep( 1 ).
В том и проблема что процессор дохнет...100% usage это разве не проблема?
Под эффектом я подразумеваю usage процессора. В моем примере 4 потока которые вместе забирают 100% процессорских ресурсов. Это нормально? |
||||||
|
|||||||
| Tectoder |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 202 Регистрация: 13.3.2007 Репутация: 7 Всего: 8 |
||||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 5 Всего: 211 |
Почему же тогда Sleep(1) снижает? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Спят они у тебя там все вместе...
Ты что, компьютер пожалел? -------------------- ... |
|||
|
||||
| Tectoder |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 202 Регистрация: 13.3.2007 Репутация: 7 Всего: 8 |
Труд сделает из компьютера обезьяну
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 5 Всего: 211 |
Ну откровенно говоря нет...меня скорее смутил факт что один такой поток забирает 50%, два - 100%...а у меня таких потоков должно быть около 10..и меня терзают сомнения что все эти потоки совместно будут работать нормально...Кстати работать они должны беспрерывно..днями и ночами..короче говоря трудиться будут как негры на плантациях...Компания интел не подаст на меня в суд за порабощение ихнего производства? Добавлено @ 09:51 Добавил в свой пример еще 10 потоков...в результате программа забирает у процессора все что вообще возможно и оказалось...стала она работать на порядок медленее чем с 4 потоками. В случае же с Sleep( 1 ) результат остался прежним. Теперь разница в скорости работы стала около 150 раз..еще несколько потоков и скорость станет одинаковой. Плюсь процессор не будет так нагружен...хммм, я в сомнениях..что же делать? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Больше 100% никак не возьмут. С чего это ты взял? При большом числе потоков просто нет совместного простоя. Процессор (одноядерный) в любом случае больше потока одномоментно выполнять не может. Да не грузись ты ерундой! Решат проблемы надо по мере их поступления, а не заранее придумывать - а вдруг! Кроме того - а какие у тебя альтернативы: ставить Sleep(1) или нет? Ну поставишь потом, если решишь, что надо. Кстати - зачем тебе самому переключать потоки? Но, допустим, даже если действительно нужно - итерации должны быть гораздо крупнее: переключения то не бесплатны... -------------------- ... |
|||
|
||||
| azesmcar |
|
||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 5 Всего: 211 |
Оптимистично
С примера, ставлю Sleep(1) нагрузка процессора 0%.
Проблема в том что 10 потоков с Sleep(0) так пожирают ресурсы что администрировать сервер уже становится невозможным. А остановить сервис на время не дело. Он не должен останавливаться вообще теоретически.
Если не переключать потоки вообще то некоторым из моих же потоков управление не передается вообще. В принципе ставить Sleep(1) не такая уж проблема, несколько милисекунд простоя на затормозят мою программу до невозможности. Вопрос в том правильно ли это? Я просто никогда не видел программу которая бы постоянно так жрала ресурсы процессора и мне поведение моей программы кажется странным. Может у меня организация потока неверно сделана если уж он никогда не спит..Просто по другому не представляю как? Non Blocking Server Socket чидает данные и выдает события...больше ничего кроме этого и обработки этих самых событий от потока не требуется. Это сообщение отредактировал(а) azesmcar - 22.3.2007, 10:43 |
||||||||
|
|||||||||
| seacat79 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 27.2.2007 Где: Украина, Одесса Репутация: нет Всего: 1 |
Если я правильно понял, то у тебя программа прослушивает TCP/IP порт и обрабатывает поступившие данные. Если это так, то у тебя действительно что-то неправильно написано, так как при вызове, кажется listen(), поток должен уходить в спячку до момента установления соединения с данным портом, причем за это отвечает система. Более конкретно ничего сказасть не могу, так как не видно кода самого потока |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Согласна с предыдущем оратором. Если ты непрерывно спрашиваешь, а нет ли чего для меня - то это неправильно. Тогда действительно, сожрешь все, что есть.
-------------------- ... |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 5 Всего: 211 |
А как иначе? У меня есть лист сокетов которые ко мне присойденены. Если сделать их Blocking сокетами то recv будет спать на конкретном сокете пока от него не придет сообщение а на сообщение от остальных ему глубоко наплевать. Если сделать NonBlocking то когда же ему спать? Вопрос кажется меняется, может стоит его перенести в отдельную тему? |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |