Boost logo

Boost Users :

Subject: [Boost-users] thread problem - incorrect checksum for freed object - object was probably modified after being freed
From: Kraus Philipp (philipp.kraus_at_[hidden])
Date: 2010-08-17 15:39:06


Hi,

I create some boost::threads:

         std::vector< worker<T,D> > l_worker;
         boost::thread_group l_threadgroup;
         for(std::size_t i=0; i < p_threads; ++i) {
            l_worker.push_back( worker<T,D>(p_iteration, p_stepsize,
m_fulltable, m_derivation, m_optimize, m_static, p_batch) );
              
l_threadgroup.create_thread( boost::bind( &worker<T,D>::optimize,
l_worker[i] ) );
         }

         l_threadgroup.join_all();

In the constructor of my worker-object makes a copy of the parameters
( p_iteration = std::size_t, p_stepsize = T (double), p_batch =
std::vector and the others are std::map):

   ... ) :
         m_iteration( p_iteration ), m_stepsize( p_stepsize ),
m_symbols(), m_derivation(), m_initvalues(), m_staticvalues(),
         m_batch()
     {

         std::copy( p_derivation.begin(), p_derivation.end(),
std::inserter(m_derivation, m_derivation.begin()));
         std::copy( p_initvalues.begin(), p_initvalues.end(),
std::inserter(m_initvalues, m_initvalues.begin()));
         std::copy( p_syms.begin(), p_syms.end(),
std::inserter(m_symbols, m_symbols.begin()));
         }

in the optimize-method I use this code:

   GiNaC::exmap l_dynamic; // exmap is == std::map
   for(typename std::map<std::string, std::pair<T,T> >::iterator it =
m_initvalues.begin(); it != m_initvalues.end(); ++it)
             l_dynamic[ m_symbols[it->first] ] = it->second.first;

If I create only one thread, everything works fine. On more thread
I'll get
main(4398,0xa07ad720) malloc: *** error for object 0xd2b880: incorrect
checksum for freed object - object was probably modified after being
freed.
*** set a breakpoint in malloc_error_break to debug

My idea is to create p_threads number of my worker objects and add
some data with the constructor parameters. Than I call the join_all
method so every object can work with their own data and after join_all
is finished I receive the data from every object.

Can someone please explain to me what I did wrong.
Thanks

Phil



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net