Что произойдет, если два процесса на разных процессорах попытаются получить блокировку ТОЧНО в одно и то же время

Итак, я читаю о синхронизации, и я прочитал различные алгоритмы, такие как спин-блокировки, семафоры и мьютекс, чтобы избежать состояния гонки.

Однако эти алгоритмы не могут предотвратить состояние гонки в SMP, когда несколько процессов обращаются к данным точно в одно и то же время.

Например, предположим, что поток 1 в процессоре A выполняет lock (mutex1); remove (1000); unlock (mutex1);

и поток 2 в процессор B запускает lock (mutex1); deposit (1000); deposit (1000); unlock (mutex1);

Когда выполняются оба потока ТОЧНО В ОДИН ВРЕМЯ оба потока одновременно окажутся в критической секции.

Единственное решение (должно быть на аппаратном уровне) - заставить каждый процессор немного разойтись друг с другом, но это противоречит цели параллелизма.

Существует ли какая-либо поддержка аппаратного уровня, чтобы избежать такой ситуации, когда несколько процессоров пытаются получить блокировку в одно и то же время?

(это не проблема атомарности, а скорее проблема точного параллелизма, и мне интересно, как SMP этим занимается).

12
задан SHH 23 October 2011 в 00:54
поделиться