Действительно ли нужен сон () здесь?

Так как некоторые языки не предлагают блокировку мьютекса, нужно будет создать ее самостоятельно. Я обычно пишу некоторый код, подобный этому: (псевдо-C ++, просто чтобы вы знали, что я имею в виду. Я не уверен, что мое письмо правильно, так как я не писал код C ++ годами)

oldval = 0;
newval = 1;
//suggest there was a Compare And Set operation that make only one thread return true,if no CAS operation , call any other language module that can offer a cas instead
while (!CAS(*somepointer,oldval,newval)) {
//lock failed
sleep(1000); //sleep one second or some value really depend on what you are doing.
}
//lock succeed, do something....
*somepointer = oldval; //release lock.

очевидно sleep снизит скорость обработки, но раньше я беспокоился, если sleep отбрасывается … не будут ли потоки переключаться слишком часто и снижать производительность? Теперь, когда я думаю глубже, как это sleep реализованы? Если они делают что-то вроде этого …

expired = getCurrentTime() + sleepTime;
while (getCurrentTime() < expired) { }

… это только ухудшит положение.

Теперь думаю sleep следует использовать, только если мне действительно нужно приостановить поток на некоторое время, так что, возможно, мой случай просто неверен.

2

Решение

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

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

Операционные примитивы синхронизации работают аналогично. Например, запрос блокировки мьютекса приводит к системному вызову, который переводит нить в спящий режим до тех пор, пока мьютекс не будет разблокирован; ОС знает, что мьютекс разблокирован, так как разблокировка также должна проходить через системный вызов.

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

Важная заметка: Если вы разрабатываете на платформе с открытым железом, библиотека sleep на самом деле это может быть занятое ожидание (как, например, на Arduino), так как нет планировщика ОС, чтобы перевести потоки в спящий режим. В этом случае, если важно минимизировать использование процессора (например, чтобы снизить энергопотребление), вам нужно будет найти специфичный для процессора способ приостановки ЦП, если ваша библиотека его не предоставляет.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]