2016-03-10 4 views
0

Как говорит название, у меня есть поток создается с помощью:Насколько важно вызвать Sleep() в бесконечном цикле?

CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)this->TaskProc, this, 0, NULL); 

В TaskProc, у меня есть бесконечное время цикла:

while(true) 
{ 
// large code with lots of initialization 
// get task from another thread 
// Switch (task) 
// at each case you would perform a task 
Sleep(1); 
} 

Я пытаюсь сократить время мой код принимает и я чувствую, что Sleep(1) в конце цикла while не требуется! так как в цикле while есть довольно много вычислений, прежде чем нажать Sleep(), правильно ли удалить Sleep()?

EDIT1: Я не знаю, почему этот вопрос вызвал путаницу и несколько голосов, это часть очень большого кода со многими потоками (около 5), все, что я хотел знать, когда мы должны добавить подождите в каждом цикле! Принятый ответ, похоже, дает хорошее представление о том, с чего начать. Хотя, я думаю, что может быть лучший ответ на этот вопрос.

+0

Если вы хотите сократить время, затрачиваемое вашим кодом, вы, вероятно, захотите переместить '// большой код с большим количеством инициализации' из вашего цикла while ... :-) –

+3

Почему вы спите в первом место. Сон - одна из тех функций, которые вы, вероятно, никогда не должны звонить. –

+0

@ScottMermelstein, необходим большой код, к сожалению, нет места для большей оптимизации :( – Samer

ответ

5

Это зависит от того, что происходит в вашей петле. Если он занят-ожидание и обычно ничего не делает, то вызов Sleep (это выглядит как Windows, поэтому его задержка в 1 мс) даст планировщик и может помешать нитку открутить процессорное ядро ​​и включить вентилятор вашего процессора. Если это всегда что-то делать, то 1 миллисекунды будут действительно складываться и замедлять ваше исполнение. Я предлагаю посмотреть использование ЦП в диспетчере задач с вызовом Sleep и без него и сравнить свой код с известным входом, чтобы узнать, что, если это действительно займет больше времени.

3

Если вы хотите спать так, используйте std::this_thread::yield(); вместо сна.

+2

@Samer, 'SwitchToThread' предоставит вам эту функциональность. – SergeyA

+0

'Sleep (0)' также перенесет вашу нить. – knivil

+0

@knivil Я уверен, что это неверно. AFAIK, 'Sleep (0)' позволит * разрешить * планировщику переключиться на поток с наивысшим приоритетом. Если ваш поток по-прежнему является наивысшим приоритетом, то он «переключится» на тот же поток, эффективно сделав спящий режим сна полной потерей процессора. Это тоже значительная потеря, потому что Сон должен зайти в ядро. – doug65536

Смежные вопросы