Есть ли у системного вызова sleep () недостатки? - PullRequest
2 голосов
/ 27 июня 2019

Таким образом, моя цель - выполнить часть кода, обрабатываемую потоком (скажем, потоком 1, используя потоки POSIX), одновременно отменяя другой поток (поток 2), выполняя свою соответствующую задачу. Поток 1 инициируется, когда происходит определенное событие (основанное на времени событие - в моем случае 60 секунд).

Для этого я использовал функцию sleep(). Но мой наставник сказал мне, что использование сна в многопоточной программе - плохая практика. Я не смог понять его рассуждения. Поэтому я решил сбежать отсюда.

Если моя проблема кажется слишком расплывчатой, упомяну любые недостатки sleep().

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Мой наставник сказал мне, что использование сна в многопоточной программе - это плохая практика.

Я бы оттолкнулся от этого общего утверждения.

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

Если выиметь несколько потоков, каждый из которых существует только , чтобы заставить определенную вещь происходить в определенное время, тогда вы могли бы упростить свою программу, используя вместо этого объект таймера.Если ваша программа имеет графический интерфейс пользователя, то вы, вероятно, используете инфраструктуру графического интерфейса, в которой уже есть таймер, который вы можете использовать, поэтому наличие даже одного «временного» потока, вероятно, приводит к бесполезному расходу ресурсов.

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

Если у меня есть веская причина для существования потока в моей программе *, тогдаЯ без колебаний напишу код, который его создаст, и если у меня будет веская причина для одного из моих потоков на sleep(), **, тогда я без колебаний напишу этот вызов.


* Хорошая причина существования потока - это управление неким состоящим из состояний "процессом", который прогрессирует независимо от других "процессов", происходящих внутри программы.

** Хорошая причина дляПоток в спящем режиме был бы, если бы была какая-то причина, по которой требовалась пауза между двумя шагами сложного "процесса", которым управляет поток.

1 голос
/ 27 июня 2019

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

Так что для синхронизации потоков sleep недостаточно и все усложняет (+ замедляет).

...