Я хочу, чтобы обсудить следующую структуру в golang от этого linkСтранный код для предотвращения непреднамеренного совместного использования
// Local per-P Pool appendix.
57 type poolLocal struct {
58 private interface{} // Can be used only by the respective P.
59 shared []interface{} // Can be used by any P.
60 Mutex // Protects shared.
61 pad [128]byte // Prevents false sharing.
62 }
выше структура может быть доступна только одна нить в то время, как используется мьютекс. Кодер заблокирует структуру в начале потока и разблокирует ее, когда поток завершится. Таким образом, память не разделяется между потоками. Таким образом, не более одного ядра будет иметь доступ к памяти. Итак, по моему мнению, ложного обмена не может быть здесь. Если ложного обмена не может произойти, почему кодер проложил структуру с дополнительными байтами (байт [128])? Я понимаю, что неправильно?
Да, ваше понимание неверно: «Ложное разделение» не имеет ничего общего с несколькими потоками, обращающимися к одной и той же памяти (условие гонки, если вы пишете), но с строками кэша процессора: просто Google для «ложного обмена»: – Volker
@ Volker Thabk you. Я понял. Позвольте мне пояснить. Пусть есть два потока t1 и t2, работающие на ядрах C1 и C2. Пусть t1 разрешено запускаться первым (теперь t2 ждет, когда есть заглушенный замок). Пусть t1 записывает данные в кеш l1 c1 (строка кэша, в которой хранится наша структура). Теперь t2 готов в C2. Но кэш L2 в C2 должен обновляться (по протоколу MESI) до новых значений. После этого t2 может продолжить работу. В этом случае происходит ложное совместное использование. Я прав? – user3219492
Когда вы выполняете заполнение, каждому потоку будет выделена строка кэша в L1, которая будет указывать на разные ячейки памяти в L2 или более высокой памяти. Поскольку каждый поток работает с разными ячейками памяти, они не разделяются, поэтому MESI и обмен файлами не имеют никакого отношения. Я прав? – user3219492