#0 0x00000000006ded78 in std::_Rb_tree<std::string, std::pair<std::string const, unsigned short>, std::_Select1st<std::pair<std::string const, unsigned short> >, std::less<std::string>, std::allocator<std::pair<std::string const, unsigned short> > >::_M_insert_unique(std::pair<std::string const, unsigned short> const&) [clone .constprop.93] ()
(gdb) where
#0 0x00000000006ded78 in std::_Rb_tree<std::string, std::pair<std::string const, unsigned short>, std::_Select1st<std::pair<std::string const, unsigned short> >, std::less<std::string>, std::allocator<std::pair<std::string const, unsigned short> > >::_M_insert_unique(std::pair<std::string const, unsigned short> const&) [clone .constprop.93] ()
#1 0x00000000006df400 in boost::gregorian::greg_month::get_month_map_ptr() ()
#2 0x00007f0dfbc590cd in boost::date_time::month_str_to_ushort<boost::gregorian::greg_month> (s=...) at /home/chenher/projects/cactus_strategies/cactus_includes/boost/date_time/date_parsing.hpp:67
#3 0x00007f0dfbc29115 in boost::date_time::parse_date<boost::gregorian::date> (s=..., order_spec=0) at /home/chenher/projects/cactus_strategies/cactus_includes/boost/date_time/date_parsing.hpp:143
#4 0x00007f0dfbc7b96f in parse_delimited_time<boost::posix_time::ptime> (s=..., sep=<optimized out>) at /home/chenher/projects/cactus_strategies/cactus_includes/boost/date_time/time_parsing.hpp:175
#5 time_from_string (s=...) at /home/chenher/boost/date_time/posix_time/time_parsers.hpp:31
Looking at libs/date_time/src/gregorian/greg_month.cpp:37, it is apparent that the use of a static variable renders the month_map not thread-safe:
greg_month::month_map_ptr_type greg_month::get_month_map_ptr()
{
static month_map_ptr_type month_map_ptr(new greg_month::month_map_type());
if(month_map_ptr->empty()) {
std::string s("");
for(unsigned short i = 1; i <= 12; ++i) {
greg_month m(static_cast<month_enum>(i));
s = m.as_long_string();
s = date_time::convert_to_lower(s);
month_map_ptr->insert(std::make_pair(s, i));
s = m.as_short_string();
s = date_time::convert_to_lower(s);
month_map_ptr->insert(std::make_pair(s, i));
}
}
return month_map_ptr;
}
Is there any way around this? Is there a general initialization routine I can call to get all such use of static initialized by a single thread?
Thanks.
Hering Cheng