Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Sleep(0) или Sleep(1), Как сделать чтобы поток не жрал ресурсы? 
V
    Опции темы
azesmcar
Дата 21.3.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Здравствуйте..
Возникла такая проблема. Есть поток который в цикле обрабатывает данные.
Код

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    while (true)
    {
                /* ......... */
    }
}


Этот поток по известным причинам жрет 50% ресурсов у процессора. Создадим еще один поток на эту функцию и он начнет забирать 100%. Все верно, после каждой итерации надо ставить Sleep( 0 ). Вот только эффекта от этого Sleep( 0 ) никакого. Все остается по прежнему...SwitchToThread дает аналогичный результат...Ставлю Sleep( 1 ) все в порядке...просто работает раз в 700 медленее (проверял)..
В чем собственно дело? Если не ошибаюсь (причем не только я но и дядюшка Рихтер) то Sleep( 0 ) должен был решить эту проблему...
Может я не так проверяю но
Код

#include <windows.h>
#include <iostream>

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    int& i = *((int*)lpParameter);
    while (true)
    {
        ++i;
        Sleep( 0 );
    }
}

int main()
{
    int a1 = 0, a2 = 0, a3 = 0, a4 = 0;
    CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadProc, &a1, NULL, NULL );
    CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadProc, &a2, NULL, NULL );
    CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadProc, &a3, NULL, NULL );
    CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadProc, &a4, NULL, NULL );
    Sleep(500);
    std::cout << a1 << " " << a2 << " " << a3 << " " << a4 << std::endl;
    return 0;
}

этот код выдает
Цитата

199534 197256 199533 197253


а тот же код с Sleep(1) выдает
Цитата

257 257 257 256


Это сообщение отредактировал(а) azesmcar - 21.3.2007, 17:13
PM   Вверх
Earnest
Дата 21.3.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Я не совсем понимаю, в чем вопрос или проблема.
Sleep (0) не жрет время зря, а просто отдает управление системе (а та - следующему потоку). Sleep(1) - тоже самое, но еще и простаивает. А даже за одну мс много итераций сделать можно. (Причем я как-то сомневаюсь, что он спит только 1, скорее все 10 - по крайней мере, такая дискретность у таймера). Так что разница во времени выполнения понятна. В чем вопрос-то? Как тебе достичь - чего?


--------------------
...
PM   Вверх
W4FhLF
Дата 21.3.2007, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Да просто всё. При Sleep(0) поток не усыпляется, а система просто отдаёт время планировщику, а тот сразу же вновь твоему потоку, потому что, судя по-всему, нет других потоков нуждающихся во времени. А при Sleep(1) поток усыпляется, добавляется запись в управляющую структуру, после чего система ждёт прерывания от таймера, при возникновении прерывания она ставит твой поток в конец очереди планировщика. 
Это очень упрощённо, для понимания этой схемы чтиво Рихтера слишком поверхностно.

Добавлено @ 17:32 
Опередили.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Tectoder
Дата 21.3.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: 7
Всего: 8



Цитата(azesmcar @  21.3.2007,  17:11 Найти цитируемый пост)
Вот только эффекта от этого Sleep( 0 ) никакого.
На самом деле эффект есть. Он проявится как только в системе окажеться еще один конкурирующий поток. Так что юзай это или SwitchToThread и успокойся.

Это сообщение отредактировал(а) Tectoder - 21.3.2007, 19:07
PM   Вверх
azesmcar
Дата 21.3.2007, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Цитата

Причем я как-то сомневаюсь, что он спит только 1, скорее все 10 - по крайней мере, такая дискретность у таймера


Я тоже так думал..оказалось нет
Sleep( 2 ) в моем примере выдает результат вдвое меньше чем в Sleep( 1 ).
Цитата

Я не совсем понимаю, в чем вопрос или проблема.


В том и проблема что процессор дохнет...100% usage это разве не проблема?
Цитата

На самом деле эффект есть. Он проявится как только в системе окажеться еще один конкурирующий поток. Так что юзай это или SwitchToThread и успокойся.

Под эффектом я подразумеваю usage процессора.
В моем примере 4 потока которые вместе забирают 100% процессорских ресурсов. Это нормально?
PM   Вверх
Tectoder
Дата 21.3.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: 7
Всего: 8



Цитата(azesmcar @  21.3.2007,  22:06 Найти цитируемый пост)
Это нормально? 
Да. Ты боишься что он перетрудится?
SwitchToThread нужно для предотвращения "дегродации" системы(правда, тут этот термин не совсем в тему, ну да ладно). Он никак не снизит загрузку процессора.
PM   Вверх
azesmcar
Дата 21.3.2007, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Цитата

Он никак не снизит загрузку процессора. 


Почему же тогда Sleep(1) снижает?
PM   Вверх
Earnest
Дата 21.3.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Спят они у тебя там все вместе...
Ты что, компьютер пожалел?  smile Он железный! Наоборот хорошо, пусть трудится.


--------------------
...
PM   Вверх
Tectoder
Дата 22.3.2007, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: 7
Всего: 8



Труд сделает из компьютера обезьяну
PM   Вверх
azesmcar
Дата 22.3.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Цитата

Ты что, компьютер пожалел?  smile Он железный! Наоборот хорошо, пусть трудится.


Ну откровенно говоря нет...меня скорее смутил факт что один такой поток забирает 50%, два - 100%...а у меня таких потоков должно быть около 10..и меня терзают сомнения что все эти потоки совместно будут работать нормально...Кстати работать они должны беспрерывно..днями и ночами..короче говоря трудиться будут как негры на плантациях...Компания интел не подаст на меня в суд за порабощение ихнего производства?

Добавлено @ 09:51 
Добавил в свой пример еще 10 потоков...в результате программа забирает у процессора все что вообще возможно и оказалось...стала она работать на порядок медленее чем с 4 потоками. В случае же с Sleep( 1 ) результат остался прежним. Теперь разница в скорости работы стала около 150 раз..еще несколько потоков и скорость станет одинаковой. Плюсь процессор не будет так нагружен...хммм, я в сомнениях..что же делать?  smile 
PM   Вверх
Earnest
Дата 22.3.2007, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(azesmcar @  22.3.2007,  10:43 Найти цитируемый пост)
...а у меня таких потоков должно быть около 10..

Больше 100% никак не возьмут. smile 
Цитата(azesmcar @  22.3.2007,  10:43 Найти цитируемый пост)
Плюсь процессор не будет так нагружен...

С чего это ты взял? При большом числе потоков просто нет совместного простоя. Процессор (одноядерный) в любом случае больше потока одномоментно выполнять не может.

Да не грузись ты ерундой! Решат проблемы надо по мере их поступления, а не заранее придумывать - а вдруг!
Кроме того - а какие у тебя альтернативы: ставить Sleep(1) или нет? Ну поставишь потом, если решишь, что надо. Кстати - зачем тебе самому переключать потоки? Но, допустим, даже если действительно нужно - итерации должны быть гораздо крупнее: переключения то не бесплатны...


--------------------
...
PM   Вверх
azesmcar
Дата 22.3.2007, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Цитата

Больше 100% никак не возьмут. smile 


Оптимистично smile
Цитата

С чего это ты взял? При большом числе потоков просто нет совместного простоя. Процессор (одноядерный) в любом случае больше потока одномоментно выполнять не может.


С примера, ставлю Sleep(1) нагрузка процессора 0%.

Цитата

Кроме того - а какие у тебя альтернативы: ставить Sleep(1) или нет? Ну поставишь потом, если решишь, что надо. 

Проблема в том что 10 потоков с Sleep(0) так пожирают ресурсы что администрировать сервер уже становится невозможным. А остановить сервис на время не дело. Он не должен останавливаться вообще теоретически. 
Цитата

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


Если не переключать потоки вообще то некоторым из моих же потоков управление не передается вообще.

В принципе ставить Sleep(1) не такая уж проблема, несколько милисекунд простоя на затормозят мою программу до невозможности. Вопрос в том правильно ли это? Я просто никогда не видел программу которая бы постоянно так жрала ресурсы процессора и мне поведение моей программы кажется странным. 
Может у меня организация потока неверно сделана если уж он никогда не спит..Просто по другому не представляю как? Non Blocking Server Socket чидает данные и выдает события...больше ничего кроме этого и обработки этих самых событий от потока не требуется. 

Это сообщение отредактировал(а) azesmcar - 22.3.2007, 10:43
PM   Вверх
seacat79
Дата 22.3.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 27.2.2007
Где: Украина, Одесса

Репутация: нет
Всего: 1



Цитата(azesmcar @  22.3.2007,  10:40 Найти цитируемый пост)
Может у меня организация потока неверно сделана если уж он никогда не спит..Просто по другому не представляю как? Non Blocking Server Socket чидает данные и выдает события...больше ничего кроме этого и обработки этих самых событий от потока не требуется. 


Если я правильно понял, то у тебя программа прослушивает TCP/IP порт и обрабатывает поступившие данные. Если это так, то у тебя действительно что-то неправильно написано, так как при вызове, кажется listen(), поток должен уходить в спячку до момента установления соединения с данным портом, причем за это отвечает система. Более конкретно ничего сказасть не могу, так как не видно кода самого потока
PM MAIL ICQ   Вверх
Earnest
Дата 22.3.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Согласна с предыдущем оратором. Если ты непрерывно спрашиваешь, а нет ли чего для меня - то это неправильно. Тогда действительно, сожрешь все, что есть.



--------------------
...
PM   Вверх
azesmcar
Дата 22.3.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Цитата

Согласна с предыдущем оратором. Если ты непрерывно спрашиваешь, а нет ли чего для меня - то это неправильно. Тогда действительно, сожрешь все, что есть.


А как иначе? У меня есть лист сокетов которые ко мне присойденены. Если сделать их Blocking сокетами то recv будет спать на конкретном сокете пока от него не придет сообщение а на сообщение от остальных ему глубоко наплевать. Если сделать NonBlocking то когда же ему спать? Вопрос кажется меняется, может стоит его перенести в отдельную тему?
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.