С одноядерным процессором, где все ваши потоки запускаются из одного одного процессора, идея реализации критического раздела с использованием атомной тестовой и заданной операции на некоторых мьютексах (или семафоре или т.д.) в памяти кажется достаточно прост; потому что ваш процессор выполняет тестовый набор из одного места в вашей программе, он обязательно не может делать один из другого места в вашей программе, замаскированный под какой-то другой поток.
Но что происходит, когда у вас действительно есть несколько физических процессоров? Кажется, что простой арифметики уровня инструкций недостаточно, b/c с двумя процессорами, потенциально выполняющими свои тестовые и заданные операции в одно и то же время, то, что вам действительно нужно для поддержания атомарности, является доступ к местоположению разделяемой памяти мьютекс. (И если местоположение разделяемой памяти загружено в кеш, есть и целая проблема с сохранением кеша, тоже...)
Похоже, что это повлечет за собой гораздо больше накладных расходов, чем одноядерный случай, так что вот здесь вопрос: насколько это хуже? Это хуже? Мы просто живем с этим? Или обойти его, применяя политику, что все потоки внутри группы процессов должны жить на одном физическом ядре?