ВЕРСИЯ 1
class Doh {
private:
static std::map<const std::string, const Doh*> someMap;
std::string stringValue_;
public:
Doh(std::string str) : stringValue_(str) {
Doh::someMap.insert(
std::make_pair<const std::string,const Doh*>
(this->stringValue_,this)
);
}
}
С MSVC 2010 выше было все в порядке, но с MSVC 2008 он не работает - и я думаю, это потому, что объект еще не создан, когда он вставлен в карту (я получил нарушение доступа к памяти).
Итак, я попытался отложенная вставка , которая сработала:
ВЕРСИЯ 2
Doh(std::string str) : stringValue_(str) {
boost::thread(&Doh::insertIntoTheStaticMap,this);
}
void insertIntoTheStaticMap() {
boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
Doh::someMap.insert(
std::make_pair<const std::string,const Doh*>
(this->stringValue_,this)
);
}
Но, как вы можете догадаться, я намерен использовать
static Doh :: someMap в качестве общего поискового словаря.
ВЕРСИИ 1 не требовалось никакой безопасности потока, потому что я бы создал все экземпляры Doh в одном и том же потоке - в блоках инициализации - которые будут вызываться динамическими инициализаторами до того, как я введу main ().
Но в VERSION 2 наивный сон () не является ни грациозным, ни надежным (не говоря уже о том, что перед вставкой мне может понадобиться заблокировать карту).
Каким будет хороший подход поцелуя?