Две распространенные идиомы блокировки:
if (!atomic_swap(lockaddr, 1)) /* got the lock */
и:
if (!atomic_compare_and_swap(lockaddr, 0, val)) /* got the lock */
где val
может быть просто константой или идентификатором нового предполагаемого владельца блокировки.
Я хотел бы знать, есть ли какая-либо значительная разница в производительности между ними на машинах x86 (и x86_64). Я знаю, что это довольно широкий вопрос, поскольку ответ может сильно различаться в зависимости от модели процессора, но это одна из причин, по которой я спрашиваю SO, а не просто выполняю тесты на нескольких процессорах, к которым у меня есть доступ.