Има ли начин за внедряване на единичен обект в C++, който е:
- Мързеливо конструиран по безопасен за нишки начин (две нишки могат едновременно да бъдат първият потребител на сингълтона - той все още трябва да бъде конструиран само веднъж).
- Не разчита на статични променливи, които са конструирани предварително (така че единичният обект сам по себе си е безопасен за използване по време на конструирането на статични променливи).
(Не познавам достатъчно добре моя C++, но дали интегралните и константните статични променливи се инициализират преди да се изпълни какъвто и да е код (т.е. дори преди да се изпълнят статичните конструктори - техните стойности може вече да са "инициализирани" в програмата) Ако е така - може би това може да се използва за внедряване на сингълтон мютекс - който от своя страна може да се използва за защита на създаването на истински сингълтон..)
Отлично, изглежда, че сега имам няколко добри отговора (жалко, че не мога да отбележа 2 или 3 като отговор). Изглежда, че има две широки решения:
- Използване на статична инициализация (за разлика от динамична инициализация) на статична променлива на POD и внедряване на моя собствен mutex с помощта на вградените атомарни инструкции. Това беше типът решение, за което намекнах във въпроса си и вярвам, че вече знаех.
- Използвайте някоя друга библиотечна функция като pthread_once или boost::call_once. За тях със сигурност не знаех - и съм много благодарен за публикуваните отговори.