Obecnie używam boost::program_options
do parsowania pliku konfiguracyjnego na BeagleBoard (procesor oparty na ARM). Mój program jest wielowątkowy i połączony z bibliotekami boost 1.45 multithreaded
.boost :: Program_options wisi na ramieniu "czasami"
Mój program po prostu wydaje się zawiesić podczas parsowania pliku konfiguracyjnego chociaż
namespace po = boost::program_options;
po::options_description desc("Options");
uint32_t option1=0;
std::vector<std::string> optionsString;
std::cout<<"Before adding options"<<std::endl;
desc.add_options()
("option1",
po::value<uint32_t>(&option1), "...")
("finaloption",
po::value<std::vector<std::string> >(&optionsString)->multitoken(), "string of options");
//Never gets here
std::cout<<"After adding options"<<std::endl;
po::variables_map vm;
std::cout<<"Starting program"<<std::endl;
Program wiesza przed wydrukowaniem out „Po dodaniu opcji”. Jeśli uruchomię program za pomocą gdb, zatrzymam go i wykonam powrót do tyłu, po prostu pokazuje, że był na linii przed komentarzem "Nigdy tu nie ma". Wierzchołek backtrace po prostu musi go w
#0 ??
#1 __lll_lock_wait lowlevellock.c:47
#2 __pthread_mutex_lock pthread_mutex_lock.c:61
#3 in boost::shared_ptr<boost::program_options::option_description>* std::__uninitialized_move_a<boost::shared_ptr<boost::program_options::option_description>*, boost::shared_ptr<boost::program_options::option_description>*, std::allocator<boost::shared_ptr<boost::program_option::option_description> > >(boost::shared_ptr<boost::program_optionns::option_description>*, boost::shared_ptr<boost::program_options::option_description>*, std::allocator<boost::shared_ptr<boost::program_options::option_description> >&)() from /usr/local/lib/libboost_program_options-mt.so.1.45.0
#4 in std::vector<boost::shared_ptr<boost::program_options::option_description>, std::allocator<boost::shared_ptr<boost::program_options::option_description> > >::_M_insert_aux(__gnu_cxx::__normal_iterator<boost::shared_ptr<boost::program_options::option_description>, std::vector<boost::shared_ptr<boost::program_options::option_description>, std::allocator<boost::shared_ptr<boost::program_options::option_description> const&)() from /usr/local/lib/libboost_program_options-mt.so.1.45.0
#5 in boost::program_options::options_description::add(boost::shared_ptr<boost::program_options::option_description>)() from /usr/local/lib/libboost_program_options-mt.so.1.45.0
... (daj mi znać, jeśli chcesz więcej)
jakieś przemyślenia? Ten program działa poprawnie na maszynie x86
Edycja: Dalsze informacje, nie wydaje się, aby to miało miejsce przy wyłączonych optymalizacjach (skompilowanych z opcją -O2, która będzie dość konsekwentnie występować).
Edycja2: Dalsza analiza wykaże, że nadal zdarza się to przy wyłączonych optymalizacjach, -O0.
Czy możesz pokazać, co śledzenie drukuje po # 2? –
dlaczego ma spację w nazwie opcji? –
Sprawdź, który wątek trzyma blokadę i zobacz, co aktualnie robi ten wątek. Możliwe, że nadpisałeś swój zamek śmieciami i/lub używasz niezainicjowanej struktury zamka. – PlasmaHH