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