Недостатки использования сна () - PullRequest
1 голос
/ 06 февраля 2012

Для программирования c, если я хочу координировать два одновременно выполняющихся процесса, я могу использовать sleep ()Тем не менее, я слышал, что sleep () не очень хорошая идея для реализации порядка событий между процессами?Есть ли причины?

Ответы [ 3 ]

5 голосов
/ 06 февраля 2012

sleep() не является координационной функцией. Такого никогда не было. sleep() заставляет ваш процесс делать именно это - ложиться спать, не работать вообще в течение определенного периода времени.

Вы были дезинформированы. Возможно, ваш источник имел в виду то, что известно как откат после сбоя захвата блокировки, и в этом случае может быть уместным рандомизированное sleep.

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

4 голосов
/ 06 февраля 2012

Использование sleep() повлияет на задержку и загрузку процессора. Допустим, вы спите в течение 1 мс и проверяете некоторую атомарную переменную общего доступа. Средняя задержка составит (как минимум) 0,5 мс. Вы будете использовать циклы ЦП в этом неактивном потоке для опроса общей атомарной переменной. Также часто нет никаких гарантий относительно времени сна.

ОС предоставляет сервисы для связи / синхронизации между потоками / процессами. Они имеют низкую задержку, потребляют меньше циклов ЦП и часто имеют другие гарантии - это те, которые вы должны использовать ... (Например, переменные условия , события, семафоры и т. Д.). Когда вы используете их, поток / процесс не нужно «опрашивать». Ядро пробуждает ожидающие потоки / процессы, когда это необходимо (поток / процесс "блокирует").

В некоторых редких ситуациях опрос является лучшим решением для синхронизации потоков / процессов, например, spinlock , обычно когда затраты на прохождение ядра превышают время, потраченное на опрос.

0 голосов
/ 06 февраля 2012

Сон не был бы очень надежным способом для обработки порядка событий между процессами, так как есть много вещей, которые могут пойти не так. Что делать, если ваш сон () прерывается? Вам нужно быть более конкретным в том, что вы подразумеваете под «реализовать порядок событий между процессами».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...