Итак, я читаю о синхронизации, и я прочитал различные алгоритмы, такие как спин-блокировки, семафоры и мьютекс, чтобы избежать состояния гонки.
Однако эти алгоритмы не могут предотвратить состояние гонки в SMP, когда несколько процессов обращаются к данным точно в одно и то же время.
Например, предположим, что поток 1 в процессоре A выполняет lock (mutex1); remove (1000); unlock (mutex1);
и поток 2 в процессор B запускает lock (mutex1); deposit (1000); deposit (1000); unlock (mutex1);
Когда выполняются оба потока ТОЧНО В ОДИН ВРЕМЯ оба потока одновременно окажутся в критической секции.
Единственное решение (должно быть на аппаратном уровне) - заставить каждый процессор немного разойтись друг с другом, но это противоречит цели параллелизма.
Существует ли какая-либо поддержка аппаратного уровня, чтобы избежать такой ситуации, когда несколько процессоров пытаются получить блокировку в одно и то же время?
(это не проблема атомарности, а скорее проблема точного параллелизма, и мне интересно, как SMP этим занимается).