[Bug c++/29496] New: _M_invalidate function is not thread-safe in GLIBCXX_DEBUG mode

l_heldt at poczta dot onet dot pl gcc-bugzilla@gcc.gnu.org
Wed Oct 18 08:33:00 GMT 2006


_M_invalidate function in safe_iterator.tcc is not thread safe against
_M_detach()/_M_attach() functions from _Safe_iterator_base.

Here is the example of erronous scenario:

Thread1()
{
   list::iterator iter;
   lock(mutex);
   iter = myList.begin();
   ....
   // do something with iter
   ....
   unlock();  
}

Thread2()
{
   lock(mutex);
   myList.erase(myList.begin());
   unlock();  
}

The problem in this scenario is that while calling erase(), _M_invalidate()
function is called which goes through the list of all iterators without taking
a lock on __gnu_internal::iterator_base_mutex. At the same time another thread
can be deallocating lists iterator - thus calling _M_detach() function.
This leads to a SIGSEGV in _M_invalidate() function.

You should either remove concurrency support from GLIBCXX_DEBUG mode or provide
full support.


-- 
           Summary: _M_invalidate function is not thread-safe in
                    GLIBCXX_DEBUG mode
           Product: gcc
           Version: 4.0.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: l_heldt at poczta dot onet dot pl
  GCC host triplet: Linux 2.6.9-42.ELsmp #1 SMP


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29496



More information about the Gcc-bugs mailing list