«Блокировка кэша» - это просто ядро, задерживающее ответ на запрос MESI о недействительности или обмене.
Это не мьютекс или что-то еще, это то, что может сделать одно ядро, настроив способ использования существующего протокола MESI-когерентности кэша, который гарантирует, что кэш-память никогда не будет иметь конфликтующих значений для одного и того же адреса. Другие ядра не должны знать о «замке», они просто видят задержку в ответе на запрос о совместном использовании строки. (У которого не было никаких жестких сроков или ожидаемого времени ответа; оно варьируется в зависимости от конкуренции и от того, сколько других ядер также ожидают эксклюзивного доступа к линии, чтобы зафиксировать их хранилище или RMW.)
См. Может ли num ++ быть атомарным для 'int num'? для полной информации. (Возможно, это не дубликат, потому что он начинается с более широкой предпосылки и охватывает многое, что здесь не актуально.)
Модель памяти C ++ предполагает согласованную совместную память, и это, по сути, все многоядерные машины. Всегда (AFAIK) с некоторым вариантом протокола MESI кэш-когерентности.
будет ли второй поток спать?
Нет, это все на аппаратном уровне. ОС не знает, что ядро остановлено в ожидании строки кэша.
Это очень похоже на обычную ошибку кэша, ожидая, когда данные поступят из DRAM, а не из другого ядра.