- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
const Registry & Registry::getInstance()
{
Registry *instance = RegistrySingleton::instance();
if (!instance->mRootNode) {
instance->load();
}
return *instance;
}
void Registry::load()
{
try {
// ...
if (!mReader) {
mReader = XMLReaderFactory::createXMLReader();
}
// ...
mReader->parse( ... );
} catch (...) {
// ...
throw; // удачи всем пользователям обрабатывать исключения xerces...
}
}
боян синглтонно-абстрактный для чтения xml конфигурации с помощью xerces.
и не только ошибки не обрабатаешь (потому что getInstance() их бросает, угадай какой именно вызов из сотен загружает конфигурацию), но и в добавок народ не впечатал как многопоточность сделать правильно (RegistrySingleton это специализация шаблона который синхронизирует инициализацию mInstance переменной, и только).
PragramistOtBoga 07.10.2013 18:34 # −16
Stertor 07.10.2013 18:49 # +5
Какая мерзость.
Dummy00001 07.10.2013 18:58 # +5
tirinox 07.10.2013 19:41 # +2
defecate-plusplus 07.10.2013 19:09 # 0
Dummy00001 07.10.2013 19:26 # 0
defecate-plusplus 07.10.2013 19:32 # 0
Dummy00001 07.10.2013 19:42 # 0
defecate-plusplus 07.10.2013 20:07 # 0
Dummy00001 07.10.2013 22:24 # 0
WGH 07.10.2013 19:48 # 0
crastinus 07.10.2013 21:03 # +2
Для обычных машин можно так:
if (!instance->mRootNode) {
lock();
if (!instance->mRootNode) {
instance->load();
}
unlock();
}
Dummy00001 07.10.2013 22:16 # 0
bormand 08.10.2013 05:52 # 0
load() засовывает что-то нибудь в mRootNode, и следующий поток благополучно улетает его юзать недозагруженный конфиг безо всяких локов :) На интелах, емнип, из-за упорядочивания записи можно делать запись в mRootNode последней (и надеяться, что компилятор ничего не переупорядочит), но один хер код очень хрупкий.
roman-kashitsyn 08.10.2013 09:00 # +1