yigal_s: (Default)
[personal profile] yigal_s
попал на забавный клин в синглетоне: функция getInstance() может быть вызвана из-под конструктора, вызваного опять же из функции getInstance() для того же самого класса. Не обязательно напрямую, разумеется, а через цепочку вызовов. В моём случае всё было еще сложнее: getInstance() обратилась к кому-то там через COM, и пока вызов отрабатывался, в тот же тред пришел другой COM-вызов (вот не понимаю, зачем микрософт такое разрешил), приведший к новому вызову getInstance().

Иными словами
1. функция getInstance для класса T вызвается в самый первый раз
2. вызывается конструктор класса Т
3. конструктор вызывает еще что-то-там
4. что-то-там вызывает getInstance для класса Т


Вроде бы, ни в одной книжной имплементации синглетона я не видел защиты от подобного сценария, или упоминания о нём.

Date: 2006-01-25 11:40 am (UTC)
From: [identity profile] solomon2.livejournal.com
Против (бесконечно-рекурсивного) лома нет приема :-)

Date: 2006-01-25 11:44 am (UTC)
From: [identity profile] dimrub.livejournal.com
Можно сериализовать COM запросы в поток, используя STA.

Date: 2006-01-25 12:50 pm (UTC)
From: [identity profile] peresmeshnik.livejournal.com
Ужос этот ваш С++...