Новая машинная модель С++ 11 позволяет многопроцессорным системам работать надежно, прим. к реорганизации инструкций.
Как отметил Мейерс и Александреску, "простая" реализация Double-Checked Locking Pattern небезопасна в С++ 03
Singleton* Singleton::instance() {
if (pInstance == 0) { // 1st test
Lock lock;
if (pInstance == 0) { // 2nd test
pInstance = new Singleton;
}
}
return pInstance;
}
Они показали в свою статью, что независимо от того, что вы делаете в качестве программиста, на С++ 03 у компилятора слишком много свободы: разрешено изменять порядок инструкций таким образом, чтобы вы могли не быть уверены, что в итоге вы получите только один экземпляр Singleton
.
Мой вопрос:
- Ограничения/определения новой модели машины С++ 11 теперь ограничивают последовательность инструкций, что вышеуказанный код всегда будет работать с компилятором С++ 11?
- Как выглядит безопасная С++ 11-реализация этого шаблона Singleton при использовании новых возможностей библиотеки (вместо mock
Lock
здесь)?