Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
if (pt == 0)
{
StaticLock lock;
pt = &singleUnsafe<T>();
}
return *pt;
pt = &singleUnsafe<T>();
В настоящий момент сложно себе представить программное обеспечение, работающее в одном потоке. Конечно, существует ряд простых задач, для которых один поток более, чем достаточен. Однако так бывает далеко не всегда и большинство задач средней или высокой сложности так или иначе используют многопоточность.
Рассмотрим это поподробнее. Данную строчку можно переписать следующим образом (я опущу обработку исключений для краткости)
Example:
The Singleton object is not created yet and the instance is NULL.
Thread 1: is creating the Singleton object (the Singleton is not created in the virtual memory yet) due to optimizing actions taken by the compiler.
m_instance = new SingletonObject( )
However, the pointer to the Singleton is already created and is not NULL.
Thread 2: this thread gets focus, and will not fall through the first conditional check since the pointer is valid. As already mentioned before, the Singleton object is not created in the memory yet and the instance is returned.
Thread 2: will crash using this pointer, since it’s pointing to a memory which is not allocated yet.
a = b;
c = d;Ни в коем случае! Завершение записи значения value в память по адресу mem означает, что чтение этого адреса на любом из ядер вернет одинаковый результат — value.
Сразу после выполнения mov [mem],value в [mem] увидим значение value с любого ядра. Это гарантирует когерентность кэша.
pt = operator new(sizeof(T));. Память выделяется на этапе компиляции в серкии .bss или .data. В данном случае в .bss т.к. объект не мог быть создан на этапе компиляции. Есть только вызов конструктора объекта по этому адресу. Причем скорее всего не через placement new, а напрямую.Нет там никакого динамического выделения памяти
Реализация синглтона в многопоточном приложении