
Hi, If I invoke boost::posix_time::time_from_string() from multiple threads I get a core dump: #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