Так как некоторые языки не предлагают блокировку мьютекса, нужно будет создать ее самостоятельно. Я обычно пишу некоторый код, подобный этому: (псевдо-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
следует использовать, только если мне действительно нужно приостановить поток на некоторое время, так что, возможно, мой случай просто неверен.
sleep()
и связанные функции делают системный вызов ОС, который запрашивает, чтобы ОС разбудила процесс в установленное количество времени. В некоторых случаях ОС может активировать процесс раньше (например, при получении сигнала / исключения), но в противном случае процесс получит нулевое использование ЦП во время ожидания.
Если ОС обнаружит, что все процессы находятся в спящем режиме (или заблокированы по какому-то времени), она может сама перейти в спящий режим с помощью аппаратной инструкции для отключения процессора до прерывания (например, прерывание тактового генератора, прерывание DMA и т. Д.). получено.
Операционные примитивы синхронизации работают аналогично. Например, запрос блокировки мьютекса приводит к системному вызову, который переводит нить в спящий режим до тех пор, пока мьютекс не будет разблокирован; ОС знает, что мьютекс разблокирован, так как разблокировка также должна проходить через системный вызов.
С помощью sleep
использует гораздо меньше ресурсов процессора по сравнению с простым циклом ожидания. Тем не менее, ваша ОС, вероятно, обеспечивает по крайней мере немного примитивы синхронизации (даже встроенные системы часто предоставляют их, если они каким-либо образом поддерживают потоки), такие как семафоры или блокировки. Вы должны попытаться выяснить, предоставляет ли ваша ОС эти функции, прежде чем пытаться свернуть свои собственные; Ваше приложение будет иметь лучшую производительность и скорость отклика, если вы используете предоставленные ОС примитивы синхронизации.
Важная заметка: Если вы разрабатываете на платформе с открытым железом, библиотека sleep
на самом деле это может быть занятое ожидание (как, например, на Arduino), так как нет планировщика ОС, чтобы перевести потоки в спящий режим. В этом случае, если важно минимизировать использование процессора (например, чтобы снизить энергопотребление), вам нужно будет найти специфичный для процессора способ приостановки ЦП, если ваша библиотека его не предоставляет.
Других решений пока нет …