Ваш код в порядке, и вы всегда можете попытаться сделать его короче, если у вас есть проблемы с пространством.
В других ответах упоминается производительность, и это показывает базовое незнание того, как работают блокировки.
Когда инициируется попытка блокировки, рассматриваемое ядро выдает сигнал на одном из своих контактов (LOCK), который сообщает всем другим ядрам, их кешам, всей памяти и всем устройствам управления шиной (поскольку они могут обновлять ОЗУ независимо от ядер) для завершения любых незавершенных операций с памятью. Когда они сделали это, они коллективно вызывают другой сигнал — подтверждение блокировки (LOCKA), который возвращается к исходному ядру, и происходит обмен памятью. После этого сигнал LOCK отключается.
Как только вы доберетесь сюда, вы сможете посмотреть значение, полученное с помощью xchg. Если выяснится, что другая задача/поток владеет блокировкой, вам нужно будет выполнить последовательность блокировки заново.
Предположим, что самым медленным устройством управления шиной на вашем компьютере является карта PCI с частотой 33 МГц. Если он что-то делает, для его завершения потребуется любое количество тактов шины PCI. Каждый цикл означает сто циклов ожидания на процессоре с частотой 3,3 ГГц. Подумайте об этом с точки зрения сохранения одного или двух циклов в последовательности блокировки. В ЦП, наборе микросхем и материнской плате есть несколько шин, и некоторые из них, все или ни одна из них могут быть активны в любой момент времени, например, когда инициируется LOCK. Активная шина, которая дольше всех отвечает командой LOCKA, будет определять, насколько быстро будет завершена блокировка.
Попробуйте сами: измерьте, сколько времени потребуется, чтобы сделать десять миллионов спин-блокировок (схватить и отпустить).
Я написал еще немного о спин-блокировках здесь, здесь и здесь.
Уловка производительности с блокировками шины (спин-блокировки, критические разделы в Windows) заключается в том, чтобы использовать их как можно реже, что означает организацию ваших данных, чтобы сделать это возможным. Блокировка шины, скорее всего, завершится быстрее на компьютере, не являющемся сервером. Это связано с тем, что устройства управления шиной на сервере работают более или менее постоянно. Поэтому, если ваше приложение основано на сервере, экономия на блокировках шины может иметь решающее значение для поддержания производительности.
ИЗМЕНИТЬ
Питеру Кордесу,
Вы утверждаете, что
... это не связано с мастерингом шины, по крайней мере, не на процессорах, поскольку, по крайней мере, Nehalem
Из последнего руководства по системному программированию Intel:
8.1.4 Влияние операции LOCK на внутренние кэши процессора
Для процессоров Intel486 и Pentium сигнал LOCK# всегда устанавливается на шине во время операции LOCK, даже если блокируемая область памяти кэшируется в процессоре.
Для семейств процессоров P6 и более поздних, если область памяти, заблокированная во время операции LOCK, кэшируется в процессоре, выполняющем операцию LOCK, как память с обратной записью, и полностью содержится в строке кэша, процессор может не утверждать сигнал LOCK# на шине. Вместо этого он изменит расположение памяти внутри и позволит механизму когерентности кеша гарантировать, что операция выполняется атомарно. Эта операция называется «блокировкой кэша». Механизм когерентности кэша автоматически предотвращает одновременное изменение данных в этой области двумя или более процессорами, кэшировавшими одну и ту же область памяти.
Во втором абзаце написано
... процессор не может установить сигнал LOCK# на шине.
Не знаю, как для вас, но для меня, по крайней мере, «может быть» звучит подозрительно, в отличие от «не будет» или «не будет».
Цифры, которые я привел, могут быть или не быть правильными — даже я время от времени ошибаюсь — но я призываю вас перестать цитировать тот или иной «авторитет» и вместо этого замарать руки, выполняя работу, чтобы либо опровергнуть мои цифры, либо найти ошибка(и) или несоответствия. Я включил соответствующий исходный код в другую ветку (где я также пожаловался на ваши возвышенные, теоретические, сидящие в кресле комментарии), так что вам не понадобится вечность, чтобы начать.
Начните, например, с доказательства того, что я
завышение стоимости блокировки в случае отсутствия разногласий...
Жду вашего анализа.
person
Olof Forshell
schedule
09.04.2014
xor ecx, ecx
предпочтительнееmov ecx, 0
по размеру и скорости. - person Polynomial   schedule 08.04.2014