2015-10-01 3 views
5

Я нахожусь в стадии обновления некоторого унаследованного кода на C++ до C++ 11 под Linux с использованием gcc. При попытке установить приоритеты я задал следующий вопрос. Может ли быть какое-либо преимущество при обмене вызова на usleep с вызовом std::this_thread::sleep_for? В коде я говорю о том, что работающий поток должен ждать очень короткий период. Поэтому мне не нужны какие-либо дополнительные функции, такие как прерывание сна.Должен ли я обменять спящий режим by sleep_for

+0

Да, это улучшит переносимость кода. –

+0

Каждый раз, когда вы меняете код, вы рискуете ввести ошибку так, если это не сломано, не исправляйте ее. Однако, если вы все-таки исправляете функцию, почему бы не перейти на более портативный стандартный код? – Galik

ответ

9

Да. std::this_thread::sleep_for указан стандартом C++ 11 и, следовательно, является переносным решением в любой системе с компилятором C++ 11 и стандартной библиотекой.

usleep указан POSIX.1-2001 (и объявлен устаревшим!), Что означает, что он может (надежно) использоваться только в POSIX-совместимых системах.

POSIX.1-2008 удаляет спецификацию usleep, в пользу nanosleep. По этой причине std::this_thread::sleep_for - намного лучший выбор.

(см. http://linux.die.net/man/3/usleep).

+0

Я понимаю, что я должен предпочесть функции std-соответствия функций POSIX. Но следует ли ожидать каких-либо побочных эффектов? Может ли sleep_for вести себя иначе, чем спящий? Могло ли быть вознаграждение за производительность или штраф? –

+0

Не так далеко, насколько я вижу. Оба указаны для спящего режима для _at наименьшей длительности (т. Е. Она может быть длиннее, в зависимости от планирования и т. Д.) – Andrew

+0

Что касается проблем производительности, единственным разумным способом действий является _profile_ эти два решения. Я не могу себе представить, что между ними будет значительная разница; во всяком случае, по сравнению с временем ожидания. – Andrew

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