Re: while(true)
От: shank  
Дата: 11.09.06 16:50
Оценка: 1 (1) +1
Здравствуйте, Константин Л., Вы писали:

КЛ>Есть код:


КЛ>

КЛ>while(true)
КЛ>{
КЛ>    if( SomeVolatileLongValue ) return 0;
КЛ>}

КЛ>


КЛ>выполняется в отдельном потоке и проверяет значение расшареной переменной. Иногда загрузка цп достигает 50%. Я подозреваю, что именно из-за этого кода.

КЛ>Почему так происходит и как этого можно избежать? Почему такие простые действия столько отъедают?
Этот вопрос подробно рассматривается у Рихтера, как минимум в главах 8 и 9.
Re[4]: while(true)
От: Аноним  
Дата: 12.09.06 06:50
Оценка: 1 (1) +1
Здравствуйте, remark, Вы писали:

КЛ>>hyper threading?


R>На HT всё равно 100% должно есть


R>


У меня HT (OS — WinXP Prof).
Такие циклы отжирают 50%
Re: while(true)
От: kan Великобритания  
Дата: 11.09.06 16:46
Оценка: 1 (1)
Константин Л. wrote:

> while(true)

> {
> if( SomeVolatileLongValue ) return 0;
> }
> выполняется в отдельном потоке и проверяет значение расшареной
> переменной. Иногда загрузка цп достигает 50%. Я подозреваю, что именно
> из-за этого кода.
Странно... должно быть 100%. Или у тебя 2-процессорная система?

> Почему так происходит и как этого можно избежать?

Использовать специальные системные объекты синхронизации mutex/semaphore.
Ну или на крайний случай хотя бы Sleep(100) вставить.

> Почему такие простые действия столько отъедают?

Потому что они исполняются очень-очень много раз.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: while(true)
От: bkat  
Дата: 11.09.06 17:39
Оценка: 1 (1)
Здравствуйте, Константин Л., Вы писали:

КЛ>Есть код:


КЛ>

КЛ>while(true)
КЛ>{
КЛ>    if( SomeVolatileLongValue ) return 0;
КЛ>}

КЛ>


КЛ>выполняется в отдельном потоке и проверяет значение расшареной переменной. Иногда загрузка цп достигает 50%. Я подозреваю, что именно из-за этого кода.

КЛ>Почему так происходит и как этого можно избежать? Почему такие простые действия столько отъедают?

Ничего удивительного.
На каком-нибудь Pocket PC ты таким наивным циклом батарею бы моментом разрядил.
На настольном PC просто грузишь процессор и наслаждаешься звуками кулера
Пользуйся объектами синхронизации.
Например event'ами.
Re: while(true)
От: Аноним  
Дата: 11.09.06 16:51
Оценка: +1
Вроде бы сто должно быть. Нечего извращаться так. Жди ивента.
Re[2]: while(true)
От: Лазар Бешкенадзе СССР  
Дата: 12.09.06 07:45
Оценка: :)
Здравствуйте, bkat, Вы писали:

КЛ>>

КЛ>>while(true)
КЛ>>{
КЛ>>    if( SomeVolatileLongValue ) return 0;
КЛ>>}

КЛ>>


B>На каком-нибудь Pocket PC ты таким наивным циклом батарею бы моментом разрядил.


Во как! Циклом по батарее!

Лазар
while(true)
От: Константин Л. Франция  
Дата: 11.09.06 16:34
Оценка:
Есть код:


while(true)
{
    if( SomeVolatileLongValue ) return 0;
}


выполняется в отдельном потоке и проверяет значение расшареной переменной. Иногда загрузка цп достигает 50%. Я подозреваю, что именно из-за этого кода.
Почему так происходит и как этого можно избежать? Почему такие простые действия столько отъедают?
Re[2]: while(true)
От: Константин Л. Франция  
Дата: 11.09.06 16:57
Оценка:
Здравствуйте, kan, Вы писали:

kan>Константин Л. wrote:


>> while(true)

>> {
>> if( SomeVolatileLongValue ) return 0;
>> }
>> выполняется в отдельном потоке и проверяет значение расшареной
>> переменной. Иногда загрузка цп достигает 50%. Я подозреваю, что именно
>> из-за этого кода.
kan>Странно... должно быть 100%. Или у тебя 2-процессорная система?

hyper threading?

>> Почему так происходит и как этого можно избежать?

kan>Использовать специальные системные объекты синхронизации mutex/semaphore.
kan>Ну или на крайний случай хотя бы Sleep(100) вставить.

>> Почему такие простые действия столько отъедают?

kan>Потому что они исполняются очень-очень много раз.
Re[3]: while(true)
От: remark Россия http://www.1024cores.net/
Дата: 12.09.06 05:51
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, kan, Вы писали:


kan>>Константин Л. wrote:


>>> while(true)

>>> {
>>> if( SomeVolatileLongValue ) return 0;
>>> }
>>> выполняется в отдельном потоке и проверяет значение расшареной
>>> переменной. Иногда загрузка цп достигает 50%. Я подозреваю, что именно
>>> из-за этого кода.
kan>>Странно... должно быть 100%. Или у тебя 2-процессорная система?

КЛ>hyper threading?


На HT всё равно 100% должно есть


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: while(true)
От: bkat  
Дата: 12.09.06 07:52
Оценка:
Здравствуйте, Лазар Бешкенадзе, Вы писали:

B>>На каком-нибудь Pocket PC ты таким наивным циклом батарею бы моментом разрядил.


ЛБ>Во как! Циклом по батарее!


Ну дак...
Процессор будет загружен на 100%,
что непременно скажется на скорости разряда батареи
Re[5]: while(true)
От: remark Россия http://www.1024cores.net/
Дата: 12.09.06 07:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, remark, Вы писали:


КЛ>>>hyper threading?


R>>На HT всё равно 100% должно есть


R>>


А>У меня HT (OS — WinXP Prof).

А>Такие циклы отжирают 50%

Ну вообще согласен, наверное так и есть


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: while(true)
От: Left2 Украина  
Дата: 12.09.06 09:13
Оценка:
R>На HT всё равно 100% должно есть

Не должно. Всё же планировщик не дурак, отправит этот цикл на один виртуальный процессор. А второй в это время будет делом заниматься — то бишь, простаивать
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: while(true)
От: Аноним  
Дата: 14.09.06 06:18
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Есть код:


КЛ>

КЛ>while(true)
КЛ>{
КЛ>    if( SomeVolatileLongValue ) return 0;
КЛ>}

КЛ>


КЛ>выполняется в отдельном потоке и проверяет значение расшареной переменной. Иногда загрузка цп достигает 50%. Я подозреваю, что именно из-за этого кода.

КЛ>Почему так происходит и как этого можно избежать? Почему такие простые действия столько отъедают?

Интересно бы было увидеть таблицу, содержащую информацию о сложности того или иного действия в вашем представлении. Например:

while(true) 1-2% CPU.
while(<boolean variable>) 2-4% CPU.
while(<condition check>) 1-2% CPU + condition check
...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.