Из обновленного вопроса:
Я предполагаю, что поскольку global :: new является поточно-ориентированным, этот перегруженный оператор new также должен быть поточно-ориентированным. Другими словами, компилятор должен генерировать код, связанный с безопасностью потоков, везде, где встречается новое ключевое слово. Это правильное предположение?
Нет.
Или, да, в том банальном смысле, что это важно для всего кода, который генерирует компилятор, а именно, что компилятору не разрешено вводить гонки данных, которых не было в исходном исходном коде (в принципе, предыдущая формулировка находится в модели памяти C ++ 11, но на практике компиляторы C ++ 98, поддерживающие потоки, в любом случае следуют ей, потому что в противном случае было бы невозможно создать надежные многопоточные программы).
IOW, компилятор помогает вам создавать потокобезопасный код до такой степени, что он не сделает поточно-ориентированный код, который вы пишете, потокобезопасным. Однако, это не идет другим путем; нет волшебной нити для безопасности потоков, которую компилятор может посыпать на ваш небезопасный код, чтобы сделать его потокобезопасным.
Другое объяснение, в частности, относительно оператор новый скопирован из комментария "n.m":
MyClass :: operator new - это обычная функция с несколько странным синтаксисом. Он не относится ни к какому новому варианту :: operator и не наследует их потокобезопасность.
или то же самое из "Kerrek SB":
Как н.м. выше я не слежу за вашим вопросом - перегруженный оператор - это просто обычная (статическая) функция-член. Это так хорошо или так плохо, как вы делаете это! Если для получения памяти в вашем операторе используется :: operator new (n);, то этот конкретный вызов является поточно-ориентированным, и вы должны также сделать все остальное поточно-ориентированным.
По правде говоря, у меня проблемы с выяснением того, что здесь до сих пор неясно ..