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